diff --git a/packages/twenty-server/.env.test b/packages/twenty-server/.env.test index 9b6993e555..2f5b1e9b5d 100644 --- a/packages/twenty-server/.env.test +++ b/packages/twenty-server/.env.test @@ -18,7 +18,6 @@ IS_IMAP_SMTP_CALDAV_ENABLED=true CALENDAR_PROVIDER_GOOGLE_ENABLED=false MESSAGING_PROVIDER_MICROSOFT_ENABLED=false CALENDAR_PROVIDER_MICROSOFT_ENABLED=false -TELEMETRY_ENABLED=false AUTH_GOOGLE_CALLBACK_URL=http://localhost:3000/auth/google/redirect AUTH_GOOGLE_APIS_CALLBACK_URL=http://localhost:3000/auth/google-apis/get-access-token diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/constants/field-metadata-standard-overrides-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/constants/field-metadata-standard-overrides-properties.constant.ts index 1276227add..ce26344a60 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/constants/field-metadata-standard-overrides-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/constants/field-metadata-standard-overrides-properties.constant.ts @@ -1,7 +1,7 @@ -import { type FlatEntityPropertiesToCompare } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-to-compare.type'; +import { type MetadataUniversalFlatEntityPropertiesToCompare } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-properties-to-compare.type'; export const FIELD_METADATA_STANDARD_OVERRIDES_PROPERTIES = [ 'label', 'description', 'icon', -] as const satisfies FlatEntityPropertiesToCompare<'fieldMetadata'>[]; +] as const satisfies MetadataUniversalFlatEntityPropertiesToCompare<'fieldMetadata'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service.ts index d5aaa354b3..6e3194cd66 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service.ts @@ -17,7 +17,8 @@ import { } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; +import { findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-universal-identifier-in-universal-flat-entity-maps-or-throw.util'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { fromCreateFieldInputToFlatFieldMetadatasToCreate } from 'src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadatas-to-create.util'; import { fromDeleteFieldInputToFlatFieldMetadatasToDelete } from 'src/engine/metadata-modules/flat-field-metadata/utils/from-delete-field-input-to-flat-field-metadatas-to-delete.util'; @@ -111,6 +112,13 @@ export class FieldMetadataService extends TypeOrmQueryService flatFieldMetadatas[0].id, - ), - flatEntityMaps: recomputedFlatFieldMetadataMaps, - }); + return findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow( + { + universalIdentifiers: allTranspiledTranspilationInputs.map( + ({ result: { flatFieldMetadatas } }) => + flatFieldMetadatas[0].universalIdentifier, + ), + flatEntityMaps: recomputedFlatFieldMetadataMaps, + }, + ); } public async findOneWithinWorkspace( diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-agent/constants/flat-agent-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-agent/constants/flat-agent-editable-properties.constant.ts index 9bd250068f..f5e396e581 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-agent/constants/flat-agent-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-agent/constants/flat-agent-editable-properties.constant.ts @@ -1,4 +1,4 @@ -import { type FlatAgent } from 'src/engine/metadata-modules/flat-agent/types/flat-agent.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_AGENT_EDITABLE_PROPERTIES = [ 'name', @@ -10,4 +10,4 @@ export const FLAT_AGENT_EDITABLE_PROPERTIES = [ 'responseFormat', 'modelConfiguration', 'evaluationInputs', -] as const satisfies (keyof FlatAgent)[]; +] as const satisfies MetadataEntityPropertyName<'agent'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-command-menu-item/constants/flat-command-menu-item-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-command-menu-item/constants/flat-command-menu-item-editable-properties.constant.ts index 564822f475..cb3091b8f6 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-command-menu-item/constants/flat-command-menu-item-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-command-menu-item/constants/flat-command-menu-item-editable-properties.constant.ts @@ -1,4 +1,4 @@ -import { type FlatCommandMenuItem } from 'src/engine/metadata-modules/flat-command-menu-item/types/flat-command-menu-item.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_COMMAND_MENU_ITEM_EDITABLE_PROPERTIES = [ 'label', @@ -6,4 +6,4 @@ export const FLAT_COMMAND_MENU_ITEM_EDITABLE_PROPERTIES = [ 'isPinned', 'availabilityType', 'availabilityObjectMetadataId', -] as const satisfies (keyof FlatCommandMenuItem)[]; +] as const satisfies MetadataEntityPropertyName<'commandMenuItem'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/__tests__/__snapshots__/all-universal-flat-entity-properties-to-compare-and-stringify.constant.constant.spec.ts.snap b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/__tests__/__snapshots__/all-universal-flat-entity-properties-to-compare-and-stringify.constant.constant.spec.ts.snap new file mode 100644 index 0000000000..32c0fd53b4 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/__tests__/__snapshots__/all-universal-flat-entity-properties-to-compare-and-stringify.constant.constant.spec.ts.snap @@ -0,0 +1,297 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ALL_UNIVERSAL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY should match snapshot 1`] = ` +{ + "agent": { + "propertiesToCompare": [ + "name", + "label", + "icon", + "description", + "prompt", + "modelId", + "responseFormat", + "modelConfiguration", + "evaluationInputs", + ], + "propertiesToStringify": [ + "responseFormat", + "modelConfiguration", + "evaluationInputs", + ], + }, + "commandMenuItem": { + "propertiesToCompare": [ + "label", + "icon", + "isPinned", + "availabilityType", + "availabilityObjectMetadataUniversalIdentifier", + ], + "propertiesToStringify": [], + }, + "fieldMetadata": { + "propertiesToCompare": [ + "defaultValue", + "description", + "icon", + "isActive", + "isLabelSyncedWithName", + "isUnique", + "label", + "name", + "options", + "standardOverrides", + "universalSettings", + ], + "propertiesToStringify": [ + "defaultValue", + "options", + "standardOverrides", + "universalSettings", + ], + }, + "frontComponent": { + "propertiesToCompare": [ + "name", + "description", + "builtComponentChecksum", + "sourceComponentPath", + "builtComponentPath", + "componentName", + ], + "propertiesToStringify": [], + }, + "index": { + "propertiesToCompare": [ + "indexType", + "indexWhereClause", + "flatIndexFieldMetadatas", + "isUnique", + "name", + ], + "propertiesToStringify": [ + "flatIndexFieldMetadatas", + ], + }, + "logicFunction": { + "propertiesToCompare": [ + "name", + "description", + "timeoutSeconds", + "checksum", + "sourceHandlerPath", + "handlerName", + "toolInputSchema", + "isTool", + "deletedAt", + "cronTriggerSettings", + "databaseEventTriggerSettings", + "httpRouteTriggerSettings", + ], + "propertiesToStringify": [ + "toolInputSchema", + "cronTriggerSettings", + "databaseEventTriggerSettings", + "httpRouteTriggerSettings", + ], + }, + "navigationMenuItem": { + "propertiesToCompare": [ + "position", + "folderUniversalIdentifier", + "name", + ], + "propertiesToStringify": [], + }, + "objectMetadata": { + "propertiesToCompare": [ + "description", + "icon", + "isActive", + "isLabelSyncedWithName", + "labelPlural", + "labelSingular", + "namePlural", + "nameSingular", + "labelIdentifierFieldMetadataUniversalIdentifier", + "standardOverrides", + ], + "propertiesToStringify": [ + "standardOverrides", + ], + }, + "pageLayout": { + "propertiesToCompare": [ + "name", + "type", + "objectMetadataUniversalIdentifier", + "deletedAt", + ], + "propertiesToStringify": [], + }, + "pageLayoutTab": { + "propertiesToCompare": [ + "title", + "position", + "deletedAt", + ], + "propertiesToStringify": [], + }, + "pageLayoutWidget": { + "propertiesToCompare": [ + "title", + "type", + "objectMetadataUniversalIdentifier", + "gridPosition", + "position", + "universalConfiguration", + "deletedAt", + ], + "propertiesToStringify": [ + "gridPosition", + "position", + "universalConfiguration", + ], + }, + "role": { + "propertiesToCompare": [ + "label", + "description", + "icon", + "canUpdateAllSettings", + "canAccessAllTools", + "canReadAllObjectRecords", + "canUpdateAllObjectRecords", + "canSoftDeleteAllObjectRecords", + "canDestroyAllObjectRecords", + "canBeAssignedToUsers", + "canBeAssignedToAgents", + "canBeAssignedToApiKeys", + ], + "propertiesToStringify": [], + }, + "roleTarget": { + "propertiesToCompare": [ + "roleUniversalIdentifier", + "userWorkspaceId", + "apiKeyId", + "agentId", + ], + "propertiesToStringify": [], + }, + "rowLevelPermissionPredicate": { + "propertiesToCompare": [ + "fieldMetadataUniversalIdentifier", + "operand", + "value", + "rowLevelPermissionPredicateGroupUniversalIdentifier", + "positionInRowLevelPermissionPredicateGroup", + "subFieldName", + "workspaceMemberFieldMetadataUniversalIdentifier", + "workspaceMemberSubFieldName", + "deletedAt", + ], + "propertiesToStringify": [ + "value", + ], + }, + "rowLevelPermissionPredicateGroup": { + "propertiesToCompare": [ + "logicalOperator", + "positionInRowLevelPermissionPredicateGroup", + "parentRowLevelPermissionPredicateGroupUniversalIdentifier", + "deletedAt", + ], + "propertiesToStringify": [], + }, + "skill": { + "propertiesToCompare": [ + "name", + "label", + "icon", + "description", + "content", + "isActive", + ], + "propertiesToStringify": [], + }, + "view": { + "propertiesToCompare": [ + "key", + "deletedAt", + "createdByUserWorkspaceId", + "name", + "type", + "icon", + "position", + "isCompact", + "openRecordIn", + "kanbanAggregateOperation", + "kanbanAggregateOperationFieldMetadataUniversalIdentifier", + "anyFieldFilterValue", + "calendarLayout", + "calendarFieldMetadataUniversalIdentifier", + "visibility", + "mainGroupByFieldMetadataUniversalIdentifier", + "shouldHideEmptyGroups", + ], + "propertiesToStringify": [], + }, + "viewField": { + "propertiesToCompare": [ + "isVisible", + "size", + "position", + "aggregateOperation", + "deletedAt", + ], + "propertiesToStringify": [], + }, + "viewFilter": { + "propertiesToCompare": [ + "viewUniversalIdentifier", + "deletedAt", + "fieldMetadataUniversalIdentifier", + "operand", + "value", + "viewFilterGroupUniversalIdentifier", + "positionInViewFilterGroup", + "subFieldName", + ], + "propertiesToStringify": [ + "value", + ], + }, + "viewFilterGroup": { + "propertiesToCompare": [ + "viewUniversalIdentifier", + "deletedAt", + "parentViewFilterGroupUniversalIdentifier", + "logicalOperator", + "positionInViewFilterGroup", + ], + "propertiesToStringify": [], + }, + "viewGroup": { + "propertiesToCompare": [ + "isVisible", + "fieldValue", + "position", + "deletedAt", + ], + "propertiesToStringify": [], + }, + "webhook": { + "propertiesToCompare": [ + "targetUrl", + "operations", + "description", + "secret", + ], + "propertiesToStringify": [ + "operations", + ], + }, +} +`; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/__tests__/all-universal-flat-entity-properties-to-compare-and-stringify.constant.constant.spec.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/__tests__/all-universal-flat-entity-properties-to-compare-and-stringify.constant.constant.spec.ts new file mode 100644 index 0000000000..f48d9833e2 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/__tests__/all-universal-flat-entity-properties-to-compare-and-stringify.constant.constant.spec.ts @@ -0,0 +1,16 @@ +import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; + +import { ALL_UNIVERSAL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY } from 'src/engine/metadata-modules/flat-entity/constant/all-universal-flat-entity-properties-to-compare-and-stringify.constant'; + +describe('ALL_UNIVERSAL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY', () => { + it('should match snapshot', () => { + expect( + Object.keys( + ALL_UNIVERSAL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY, + ), + ).toMatchObject(Object.values(ALL_METADATA_NAME)); + expect( + ALL_UNIVERSAL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY, + ).toMatchSnapshot(); + }); +}); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant.ts new file mode 100644 index 0000000000..49cd20cdb0 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant.ts @@ -0,0 +1,356 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type MetadataEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-entity.type'; +import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; +import { type MetadataManyToOneJoinColumn } from 'src/engine/metadata-modules/flat-entity/types/metadata-many-to-one-join-column.type'; +import { type AllJsonbPropertiesWithSerializedPropertiesForMetadataName } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/all-jsonb-properties-with-serialized-relation-by-metadata-name.constant'; +import { type ToUniversalForeignKey } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/all-universal-metadata-relations.constant'; +import { type ExtractJsonbProperties } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/extract-jsonb-properties.type'; +import { type UniversalFlatEntityExtraProperties } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; + +type HasObjectInUnion = T extends unknown + ? T extends object + ? true + : false + : never; + +type MetadataEntityPropertyConfiguration< + TMetadataName extends AllMetadataName, +> = { + [K in keyof Omit< + MetadataFlatEntity, + | Extract< + keyof MetadataFlatEntity, + keyof UniversalFlatEntityExtraProperties< + MetadataEntity, + TMetadataName + > + > + | '__universal' + >]?: { + universalProperty: K extends AllJsonbPropertiesWithSerializedPropertiesForMetadataName & + string + ? `universal${Capitalize}` + : K extends MetadataManyToOneJoinColumn & string + ? ToUniversalForeignKey + : undefined; + toStringify: K extends ExtractJsonbProperties> + ? true + : K extends keyof MetadataEntity + ? HasObjectInUnion[K]> + : boolean; + }; +}; + +export const ALL_ENTITY_PROPERTIES_CONFIGURATION_BY_METADATA_NAME = { + fieldMetadata: { + defaultValue: { toStringify: true, universalProperty: undefined }, + description: { toStringify: false, universalProperty: undefined }, + icon: { toStringify: false, universalProperty: undefined }, + isActive: { toStringify: false, universalProperty: undefined }, + isLabelSyncedWithName: { toStringify: false, universalProperty: undefined }, + isUnique: { toStringify: false, universalProperty: undefined }, + label: { toStringify: false, universalProperty: undefined }, + name: { toStringify: false, universalProperty: undefined }, + options: { toStringify: true, universalProperty: undefined }, + standardOverrides: { toStringify: true, universalProperty: undefined }, + settings: { toStringify: true, universalProperty: 'universalSettings' }, + }, + objectMetadata: { + description: { toStringify: false, universalProperty: undefined }, + icon: { toStringify: false, universalProperty: undefined }, + isActive: { toStringify: false, universalProperty: undefined }, + isLabelSyncedWithName: { toStringify: false, universalProperty: undefined }, + labelPlural: { toStringify: false, universalProperty: undefined }, + labelSingular: { toStringify: false, universalProperty: undefined }, + namePlural: { toStringify: false, universalProperty: undefined }, + nameSingular: { toStringify: false, universalProperty: undefined }, + labelIdentifierFieldMetadataId: { + toStringify: false, + // @ts-expect-error remove once https://github.com/twentyhq/core-team-issues/issues/2172 has been resolved + universalProperty: 'labelIdentifierFieldMetadataUniversalIdentifier', + }, + standardOverrides: { toStringify: true, universalProperty: undefined }, + }, + view: { + key: { toStringify: false, universalProperty: undefined }, + deletedAt: { toStringify: false, universalProperty: undefined }, + createdByUserWorkspaceId: { + toStringify: false, + universalProperty: undefined, + }, + name: { toStringify: false, universalProperty: undefined }, + type: { toStringify: false, universalProperty: undefined }, + icon: { toStringify: false, universalProperty: undefined }, + position: { toStringify: false, universalProperty: undefined }, + isCompact: { toStringify: false, universalProperty: undefined }, + openRecordIn: { toStringify: false, universalProperty: undefined }, + kanbanAggregateOperation: { + toStringify: false, + universalProperty: undefined, + }, + kanbanAggregateOperationFieldMetadataId: { + toStringify: false, + universalProperty: + 'kanbanAggregateOperationFieldMetadataUniversalIdentifier', + }, + anyFieldFilterValue: { toStringify: false, universalProperty: undefined }, + calendarLayout: { toStringify: false, universalProperty: undefined }, + calendarFieldMetadataId: { + toStringify: false, + universalProperty: 'calendarFieldMetadataUniversalIdentifier', + }, + visibility: { toStringify: false, universalProperty: undefined }, + mainGroupByFieldMetadataId: { + toStringify: false, + universalProperty: 'mainGroupByFieldMetadataUniversalIdentifier', + }, + shouldHideEmptyGroups: { toStringify: false, universalProperty: undefined }, + }, + viewField: { + isVisible: { toStringify: false, universalProperty: undefined }, + size: { toStringify: false, universalProperty: undefined }, + position: { toStringify: false, universalProperty: undefined }, + aggregateOperation: { toStringify: false, universalProperty: undefined }, + deletedAt: { toStringify: false, universalProperty: undefined }, + }, + viewGroup: { + isVisible: { toStringify: false, universalProperty: undefined }, + fieldValue: { toStringify: false, universalProperty: undefined }, + position: { toStringify: false, universalProperty: undefined }, + deletedAt: { toStringify: false, universalProperty: undefined }, + }, + index: { + indexType: { toStringify: false, universalProperty: undefined }, + indexWhereClause: { toStringify: false, universalProperty: undefined }, + flatIndexFieldMetadatas: { + toStringify: true, + universalProperty: undefined, + }, + isUnique: { toStringify: false, universalProperty: undefined }, + name: { toStringify: false, universalProperty: undefined }, + }, + logicFunction: { + name: { toStringify: false, universalProperty: undefined }, + description: { toStringify: false, universalProperty: undefined }, + timeoutSeconds: { toStringify: false, universalProperty: undefined }, + checksum: { toStringify: false, universalProperty: undefined }, + sourceHandlerPath: { toStringify: false, universalProperty: undefined }, + handlerName: { toStringify: false, universalProperty: undefined }, + toolInputSchema: { toStringify: true, universalProperty: undefined }, + isTool: { toStringify: false, universalProperty: undefined }, + deletedAt: { toStringify: false, universalProperty: undefined }, + cronTriggerSettings: { toStringify: true, universalProperty: undefined }, + databaseEventTriggerSettings: { + toStringify: true, + universalProperty: undefined, + }, + httpRouteTriggerSettings: { + toStringify: true, + universalProperty: undefined, + }, + }, + viewFilter: { + viewId: { + toStringify: false, + universalProperty: 'viewUniversalIdentifier', + }, + deletedAt: { toStringify: false, universalProperty: undefined }, + fieldMetadataId: { + toStringify: false, + universalProperty: 'fieldMetadataUniversalIdentifier', + }, + operand: { toStringify: false, universalProperty: undefined }, + value: { toStringify: true, universalProperty: undefined }, + viewFilterGroupId: { + toStringify: false, + universalProperty: 'viewFilterGroupUniversalIdentifier', + }, + positionInViewFilterGroup: { + toStringify: false, + universalProperty: undefined, + }, + subFieldName: { toStringify: false, universalProperty: undefined }, + }, + role: { + label: { toStringify: false, universalProperty: undefined }, + description: { toStringify: false, universalProperty: undefined }, + icon: { toStringify: false, universalProperty: undefined }, + canUpdateAllSettings: { toStringify: false, universalProperty: undefined }, + canAccessAllTools: { toStringify: false, universalProperty: undefined }, + canReadAllObjectRecords: { + toStringify: false, + universalProperty: undefined, + }, + canUpdateAllObjectRecords: { + toStringify: false, + universalProperty: undefined, + }, + canSoftDeleteAllObjectRecords: { + toStringify: false, + universalProperty: undefined, + }, + canDestroyAllObjectRecords: { + toStringify: false, + universalProperty: undefined, + }, + canBeAssignedToUsers: { toStringify: false, universalProperty: undefined }, + canBeAssignedToAgents: { toStringify: false, universalProperty: undefined }, + canBeAssignedToApiKeys: { + toStringify: false, + universalProperty: undefined, + }, + }, + roleTarget: { + roleId: { + toStringify: false, + universalProperty: 'roleUniversalIdentifier', + }, + userWorkspaceId: { toStringify: false, universalProperty: undefined }, + apiKeyId: { toStringify: false, universalProperty: undefined }, + agentId: { toStringify: false, universalProperty: undefined }, + }, + agent: { + name: { toStringify: false, universalProperty: undefined }, + label: { toStringify: false, universalProperty: undefined }, + icon: { toStringify: false, universalProperty: undefined }, + description: { toStringify: false, universalProperty: undefined }, + prompt: { toStringify: false, universalProperty: undefined }, + modelId: { toStringify: false, universalProperty: undefined }, + responseFormat: { toStringify: true, universalProperty: undefined }, + modelConfiguration: { toStringify: true, universalProperty: undefined }, + evaluationInputs: { toStringify: true, universalProperty: undefined }, + }, + pageLayout: { + name: { toStringify: false, universalProperty: undefined }, + type: { toStringify: false, universalProperty: undefined }, + objectMetadataId: { + toStringify: false, + universalProperty: 'objectMetadataUniversalIdentifier', + }, + deletedAt: { toStringify: false, universalProperty: undefined }, + }, + pageLayoutWidget: { + title: { toStringify: false, universalProperty: undefined }, + type: { toStringify: false, universalProperty: undefined }, + objectMetadataId: { + toStringify: false, + universalProperty: 'objectMetadataUniversalIdentifier', + }, + gridPosition: { toStringify: true, universalProperty: undefined }, + position: { toStringify: true, universalProperty: undefined }, + configuration: { + toStringify: true, + universalProperty: 'universalConfiguration', + }, + deletedAt: { toStringify: false, universalProperty: undefined }, + }, + pageLayoutTab: { + title: { toStringify: false, universalProperty: undefined }, + position: { toStringify: false, universalProperty: undefined }, + deletedAt: { toStringify: false, universalProperty: undefined }, + }, + skill: { + name: { toStringify: false, universalProperty: undefined }, + label: { toStringify: false, universalProperty: undefined }, + icon: { toStringify: false, universalProperty: undefined }, + description: { toStringify: false, universalProperty: undefined }, + content: { toStringify: false, universalProperty: undefined }, + isActive: { toStringify: false, universalProperty: undefined }, + }, + commandMenuItem: { + label: { toStringify: false, universalProperty: undefined }, + icon: { toStringify: false, universalProperty: undefined }, + isPinned: { toStringify: false, universalProperty: undefined }, + availabilityType: { toStringify: false, universalProperty: undefined }, + availabilityObjectMetadataId: { + toStringify: false, + universalProperty: 'availabilityObjectMetadataUniversalIdentifier', + }, + }, + navigationMenuItem: { + position: { toStringify: false, universalProperty: undefined }, + folderId: { + toStringify: false, + universalProperty: 'folderUniversalIdentifier', + }, + name: { toStringify: false, universalProperty: undefined }, + }, + rowLevelPermissionPredicate: { + fieldMetadataId: { + toStringify: false, + universalProperty: 'fieldMetadataUniversalIdentifier', + }, + operand: { toStringify: false, universalProperty: undefined }, + value: { toStringify: true, universalProperty: undefined }, + rowLevelPermissionPredicateGroupId: { + toStringify: false, + universalProperty: 'rowLevelPermissionPredicateGroupUniversalIdentifier', + }, + positionInRowLevelPermissionPredicateGroup: { + toStringify: false, + universalProperty: undefined, + }, + subFieldName: { toStringify: false, universalProperty: undefined }, + workspaceMemberFieldMetadataId: { + toStringify: false, + universalProperty: 'workspaceMemberFieldMetadataUniversalIdentifier', + }, + workspaceMemberSubFieldName: { + toStringify: false, + universalProperty: undefined, + }, + deletedAt: { toStringify: false, universalProperty: undefined }, + }, + rowLevelPermissionPredicateGroup: { + logicalOperator: { toStringify: false, universalProperty: undefined }, + positionInRowLevelPermissionPredicateGroup: { + toStringify: false, + universalProperty: undefined, + }, + parentRowLevelPermissionPredicateGroupId: { + toStringify: false, + universalProperty: + 'parentRowLevelPermissionPredicateGroupUniversalIdentifier', + }, + deletedAt: { toStringify: false, universalProperty: undefined }, + }, + viewFilterGroup: { + viewId: { + toStringify: false, + universalProperty: 'viewUniversalIdentifier', + }, + deletedAt: { toStringify: false, universalProperty: undefined }, + parentViewFilterGroupId: { + toStringify: false, + universalProperty: 'parentViewFilterGroupUniversalIdentifier', + }, + logicalOperator: { toStringify: false, universalProperty: undefined }, + positionInViewFilterGroup: { + toStringify: false, + universalProperty: undefined, + }, + }, + frontComponent: { + name: { toStringify: false, universalProperty: undefined }, + description: { toStringify: false, universalProperty: undefined }, + builtComponentChecksum: { + toStringify: false, + universalProperty: undefined, + }, + sourceComponentPath: { toStringify: false, universalProperty: undefined }, + builtComponentPath: { toStringify: false, universalProperty: undefined }, + componentName: { toStringify: false, universalProperty: undefined }, + }, + webhook: { + targetUrl: { toStringify: false, universalProperty: undefined }, + operations: { toStringify: true, universalProperty: undefined }, + description: { toStringify: false, universalProperty: undefined }, + secret: { toStringify: false, universalProperty: undefined }, + }, +} as const satisfies { + [P in AllMetadataName]: MetadataEntityPropertyConfiguration

; +}; + +export type MetadataEntityPropertyName = + keyof (typeof ALL_ENTITY_PROPERTIES_CONFIGURATION_BY_METADATA_NAME)[T]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-flat-entity-properties-to-compare-and-stringify.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-flat-entity-properties-to-compare-and-stringify.constant.ts deleted file mode 100644 index 829f6d2db4..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-flat-entity-properties-to-compare-and-stringify.constant.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { type AllMetadataName } from 'twenty-shared/metadata'; - -import { FLAT_AGENT_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-agent/constants/flat-agent-editable-properties.constant'; -import { FLAT_COMMAND_MENU_ITEM_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-command-menu-item/constants/flat-command-menu-item-editable-properties.constant'; -import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; -import { FLAT_FIELD_METADATA_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-editable-properties.constant'; -import { FLAT_FRONT_COMPONENT_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-front-component/constants/flat-front-component-editable-properties.constant'; -import { FLAT_NAVIGATION_MENU_ITEM_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-navigation-menu-item/constants/flat-navigation-menu-item-editable-properties.constant'; -import { FLAT_OBJECT_METADATA_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-object-metadata/constants/flat-object-metadata-editable-properties.constant'; -import { FLAT_PAGE_LAYOUT_TAB_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-page-layout-tab/constants/flat-page-layout-tab-editable-properties.constant'; -import { FLAT_PAGE_LAYOUT_WIDGET_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-page-layout-widget/constants/flat-page-layout-widget-editable-properties.constant'; -import { FLAT_PAGE_LAYOUT_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-page-layout/constants/flat-page-layout-editable-properties.constant'; -import { FLAT_ROLE_TARGET_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-role-target/constants/flat-role-target-editable-properties.constant'; -import { FLAT_ROLE_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-role/constants/flat-role-editable-properties.constant'; -import { FLAT_ROW_LEVEL_PERMISSION_PREDICATE_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-row-level-permission-predicate/constants/flat-row-level-permission-predicate-editable-properties.constant'; -import { FLAT_ROW_LEVEL_PERMISSION_PREDICATE_GROUP_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-row-level-permission-predicate/constants/flat-row-level-permission-predicate-group-editable-properties.constant'; -import { FLAT_SKILL_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-skill/constants/flat-skill-editable-properties.constant'; -import { FLAT_VIEW_FIELD_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view-field/constants/flat-view-field-editable-properties.constant'; -import { FLAT_VIEW_FILTER_GROUP_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view-filter-group/constants/flat-view-filter-group-editable-properties.constant'; -import { FLAT_VIEW_FILTER_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view-filter/constants/flat-view-filter-editable-properties.constant'; -import { FLAT_VIEW_GROUP_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view-group/constants/flat-view-group-editable-properties.constant'; -import { FLAT_VIEW_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view/constants/flat-view-editable-properties.constant'; -import { FLAT_LOGIC_FUNCTION_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/logic-function/constants/flat-logic-function-editable-properties.constant'; - -type OneFlatEntityConfiguration = { - propertiesToCompare: (keyof MetadataFlatEntity)[]; - propertiesToStringify: (keyof MetadataFlatEntity)[]; -}; -export const ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY = { - fieldMetadata: { - propertiesToCompare: [ - ...FLAT_FIELD_METADATA_EDITABLE_PROPERTIES.custom, - 'standardOverrides', - ], - propertiesToStringify: [ - 'options', - 'settings', - 'standardOverrides', - 'defaultValue', - ], - }, - objectMetadata: { - propertiesToCompare: [ - ...FLAT_OBJECT_METADATA_EDITABLE_PROPERTIES.custom, - 'standardOverrides', - ], - propertiesToStringify: ['standardOverrides'], - }, - view: { - propertiesToCompare: [ - 'key', - 'deletedAt', - 'createdByUserWorkspaceId', - ...FLAT_VIEW_EDITABLE_PROPERTIES, - ], - propertiesToStringify: [], - }, - viewField: { - propertiesToCompare: [...FLAT_VIEW_FIELD_EDITABLE_PROPERTIES, 'deletedAt'], - propertiesToStringify: [], - }, - viewGroup: { - propertiesToCompare: [...FLAT_VIEW_GROUP_EDITABLE_PROPERTIES, 'deletedAt'], - propertiesToStringify: [], - }, - index: { - propertiesToCompare: [ - 'indexType', - 'indexWhereClause', - 'flatIndexFieldMetadatas', - 'isUnique', - 'name', - ], - propertiesToStringify: ['flatIndexFieldMetadatas'], - }, - logicFunction: { - propertiesToCompare: [ - ...FLAT_LOGIC_FUNCTION_EDITABLE_PROPERTIES, - 'deletedAt', - ], - propertiesToStringify: ['toolInputSchema'], - }, - viewFilter: { - propertiesToCompare: [ - 'viewId', - 'deletedAt', - ...FLAT_VIEW_FILTER_EDITABLE_PROPERTIES, - ], - propertiesToStringify: ['value'], - }, - role: { - propertiesToCompare: [...FLAT_ROLE_EDITABLE_PROPERTIES], - propertiesToStringify: [], - }, - roleTarget: { - propertiesToCompare: [...FLAT_ROLE_TARGET_EDITABLE_PROPERTIES], - propertiesToStringify: [], - }, - agent: { - propertiesToCompare: [...FLAT_AGENT_EDITABLE_PROPERTIES], - propertiesToStringify: [ - 'responseFormat', - 'modelConfiguration', - 'evaluationInputs', - ], - }, - pageLayout: { - propertiesToCompare: [...FLAT_PAGE_LAYOUT_EDITABLE_PROPERTIES, 'deletedAt'], - propertiesToStringify: [], - }, - pageLayoutWidget: { - propertiesToCompare: [ - ...FLAT_PAGE_LAYOUT_WIDGET_EDITABLE_PROPERTIES, - 'deletedAt', - ], - propertiesToStringify: ['gridPosition', 'configuration'], - }, - pageLayoutTab: { - propertiesToCompare: [ - ...FLAT_PAGE_LAYOUT_TAB_EDITABLE_PROPERTIES, - 'deletedAt', - ], - propertiesToStringify: [], - }, - skill: { - propertiesToCompare: [...FLAT_SKILL_EDITABLE_PROPERTIES], - propertiesToStringify: [], - }, - commandMenuItem: { - propertiesToCompare: [...FLAT_COMMAND_MENU_ITEM_EDITABLE_PROPERTIES], - propertiesToStringify: [], - }, - navigationMenuItem: { - propertiesToCompare: [...FLAT_NAVIGATION_MENU_ITEM_EDITABLE_PROPERTIES], - propertiesToStringify: [], - }, - rowLevelPermissionPredicate: { - propertiesToCompare: [ - ...FLAT_ROW_LEVEL_PERMISSION_PREDICATE_EDITABLE_PROPERTIES, - 'deletedAt', - ], - propertiesToStringify: ['value'], - }, - rowLevelPermissionPredicateGroup: { - propertiesToCompare: [ - ...FLAT_ROW_LEVEL_PERMISSION_PREDICATE_GROUP_EDITABLE_PROPERTIES, - 'deletedAt', - ], - propertiesToStringify: [], - }, - viewFilterGroup: { - propertiesToCompare: [ - 'viewId', - 'deletedAt', - ...FLAT_VIEW_FILTER_GROUP_EDITABLE_PROPERTIES, - ], - propertiesToStringify: [], - }, - frontComponent: { - propertiesToCompare: [...FLAT_FRONT_COMPONENT_EDITABLE_PROPERTIES], - propertiesToStringify: [], - }, - webhook: { - propertiesToCompare: ['targetUrl', 'operations', 'description', 'secret'], - propertiesToStringify: ['operations'], - }, -} as const satisfies { - [P in AllMetadataName]: OneFlatEntityConfiguration

; -}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-relations.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-relations.constant.ts index cca9fc9ac0..cf0810e0d4 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-relations.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-relations.constant.ts @@ -9,8 +9,9 @@ import { type ExtractEntityOneToManyEntityRelationProperties } from 'src/engine/ import { type FromMetadataEntityToMetadataName } from 'src/engine/metadata-modules/flat-entity/types/from-metadata-entity-to-metadata-name.type'; import { type MetadataEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-entity.type'; import { type SyncableEntity } from 'src/engine/workspace-manager/types/syncable-entity.interface'; +import { type AllJsonbPropertiesWithSerializedPropertiesForMetadataName } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/all-jsonb-properties-with-serialized-relation-by-metadata-name.constant'; -export type ManyToOneRelationValue< +export type MetadataManyToOneRelationConfiguration< TSourceMetadataName extends AllMetadataName, TRelationProperty extends ExtractEntityManyToOneEntityRelationProperties< MetadataEntity @@ -24,7 +25,6 @@ export type ManyToOneRelationValue< flatEntityForeignKeyAggregator: | keyof AddSuffixToEntityOneToManyProperties | null; - // Note: In the best of the world should not be nullable, entities should always declare inverside keys foreignKey: ExtractPropertiesThatEndsWithId< MetadataEntity, 'id' | 'workspaceId' @@ -33,35 +33,44 @@ export type ManyToOneRelationValue< ? true : false; } - : null; + : // Note: In the best of the world should not be nullable, entities should always declare inverside keys + null; type OneToManyRelationValue< TSourceMetadataName extends AllMetadataName, TRelationProperty extends ExtractEntityOneToManyEntityRelationProperties< MetadataEntity >, -> = - MetadataEntity[TRelationProperty] extends Relation< - (infer TTargetEntity extends SyncableEntity)[] - > - ? { - metadataName: FromMetadataEntityToMetadataName; - } - : null; +> = MetadataEntity[TRelationProperty] extends (infer TTargetEntity extends + SyncableEntity)[] + ? { + metadataName: FromMetadataEntityToMetadataName; + } + : null; type MetadataRelationsProperties = { [TSourceMetadataName in AllMetadataName]: { manyToOne: { [TRelationProperty in ExtractEntityManyToOneEntityRelationProperties< MetadataEntity - >]: ManyToOneRelationValue; + >]: MetadataManyToOneRelationConfiguration< + TSourceMetadataName, + TRelationProperty + >; }; oneToMany: { [TRelationProperty in ExtractEntityOneToManyEntityRelationProperties< MetadataEntity >]: OneToManyRelationValue; }; - }; + } & ([ + AllJsonbPropertiesWithSerializedPropertiesForMetadataName, + ] extends [never] + ? // eslint-disable-next-line @typescript-eslint/no-empty-object-type + {} + : { + serializedRelations: Partial>; + }); }; export const ALL_METADATA_RELATIONS = { @@ -156,6 +165,9 @@ export const ALL_METADATA_RELATIONS = { calendarViews: { metadataName: 'view' }, mainGroupByFieldMetadataViews: { metadataName: 'view' }, }, + serializedRelations: { + fieldMetadata: true, + }, }, objectMetadata: { manyToOne: { @@ -378,6 +390,9 @@ export const ALL_METADATA_RELATIONS = { application: null, }, oneToMany: {}, + serializedRelations: { + fieldMetadata: true, + }, }, rowLevelPermissionPredicate: { manyToOne: { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-required-metadata-for-validation.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-required-metadata-for-validation.constant.ts index 99015f696a..2c765614c1 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-required-metadata-for-validation.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-required-metadata-for-validation.constant.ts @@ -11,6 +11,7 @@ type MetadataRequiredForValidation = { }; }; +// TODO deprecate in favor of ALL_METADATA_RELATIONS export const ALL_METADATA_REQUIRED_METADATA_FOR_VALIDATION = { fieldMetadata: { objectMetadata: true, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-universal-flat-entity-properties-to-compare-and-stringify.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-universal-flat-entity-properties-to-compare-and-stringify.constant.ts new file mode 100644 index 0000000000..cbfad94a73 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-universal-flat-entity-properties-to-compare-and-stringify.constant.ts @@ -0,0 +1,58 @@ +import { + ALL_METADATA_NAME, + type AllMetadataName, +} from 'twenty-shared/metadata'; + +import { ALL_ENTITY_PROPERTIES_CONFIGURATION_BY_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; +import { type MetadataUniversalFlatEntityPropertiesToCompare } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-properties-to-compare.type'; +import { type MetadataUniversalFlatEntityPropertiesToStringify } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-properties-to-stringify.type'; + +type UniversalFlatEntityPropertiesToCompareAndStringify< + T extends AllMetadataName, +> = { + propertiesToCompare: MetadataUniversalFlatEntityPropertiesToCompare[]; + propertiesToStringify: MetadataUniversalFlatEntityPropertiesToStringify[]; +}; +const computeUniversalFlatEntityPropertiesToCompareAndStringify = < + T extends AllMetadataName, +>( + metadataName: T, +): UniversalFlatEntityPropertiesToCompareAndStringify => { + const entries = Object.entries( + ALL_ENTITY_PROPERTIES_CONFIGURATION_BY_METADATA_NAME[metadataName], + ) as [ + string, + { universalProperty: string | undefined; toStringify: boolean }, + ][]; + const accumulator: UniversalFlatEntityPropertiesToCompareAndStringify = { + propertiesToCompare: [], + propertiesToStringify: [], + }; + + for (const [property, configuration] of entries) { + const comparedProperty = configuration.universalProperty ?? property; + + accumulator.propertiesToCompare.push( + comparedProperty as MetadataUniversalFlatEntityPropertiesToCompare, + ); + if (configuration.toStringify === true) { + accumulator.propertiesToStringify.push( + comparedProperty as MetadataUniversalFlatEntityPropertiesToStringify, + ); + } + } + + return accumulator; +}; + +export const ALL_UNIVERSAL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY = + Object.values(ALL_METADATA_NAME).reduce( + (acc, metadataName) => ({ + ...acc, + [metadataName]: + computeUniversalFlatEntityPropertiesToCompareAndStringify(metadataName), + }), + {} as { + [P in AllMetadataName]: UniversalFlatEntityPropertiesToCompareAndStringify

; + }, + ); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/__tests__/all-flat-entity-by-metadata-engine-name.test-type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/__tests__/all-flat-entity-by-metadata-engine-name.test-type.ts index 946d006a91..5842dfe2e5 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/__tests__/all-flat-entity-by-metadata-engine-name.test-type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/__tests__/all-flat-entity-by-metadata-engine-name.test-type.ts @@ -18,7 +18,8 @@ type ExpectedGenericFlatEntityInformation = { [P in WorkspaceMigrationActionType]: unknown; }; flatEntity: SyncableFlatEntity; - universalFlatEntity: UniversalSyncableFlatEntity; + // TODO remove SyncableFlatEntity once every metadata has been universal migrated + universalFlatEntity: UniversalSyncableFlatEntity | SyncableFlatEntity; entity: unknown; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/__tests__/flat-entity-update.type-test.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/__tests__/flat-entity-update.type-test.ts new file mode 100644 index 0000000000..172f563d94 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/__tests__/flat-entity-update.type-test.ts @@ -0,0 +1,62 @@ +import { + type HasAllProperties, + type Equal, + type Expect, +} from 'twenty-shared/testing'; + +import { type FlatEntityUpdate } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-update.type'; + +// eslint-disable-next-line unused-imports/no-unused-vars +type Assertions = [ + Expect< + Equal< + keyof FlatEntityUpdate<'fieldMetadata'>, + | 'name' + | 'label' + | 'icon' + | 'description' + | 'isActive' + | 'defaultValue' + | 'standardOverrides' + | 'options' + | 'settings' + | 'isUnique' + | 'isLabelSyncedWithName' + | 'universalSettings' + > + >, + Expect< + HasAllProperties< + FlatEntityUpdate<'fieldMetadata'>, + { + universalSettings?: never; + } + > + >, + + Expect< + Equal< + keyof FlatEntityUpdate<'objectMetadata'>, + | 'icon' + | 'description' + | 'isActive' + | 'standardOverrides' + | 'isLabelSyncedWithName' + | 'nameSingular' + | 'namePlural' + | 'labelSingular' + | 'labelPlural' + | 'labelIdentifierFieldMetadataId' + | 'labelIdentifierFieldMetadataUniversalIdentifier' + > + >, + + Expect< + HasAllProperties< + FlatEntityUpdate<'objectMetadata'>, + { + labelIdentifierFieldMetadataUniversalIdentifier?: never; + } + > + >, +]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name.ts index c446a9b23a..16f3dc50dc 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name.ts @@ -1,5 +1,3 @@ -import { type AgentEntity } from 'src/engine/metadata-modules/ai/ai-agent/entities/agent.entity'; -import { type CommandMenuItemEntity } from 'src/engine/metadata-modules/command-menu-item/entities/command-menu-item.entity'; import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { type FlatAgentMaps } from 'src/engine/metadata-modules/flat-agent/types/flat-agent-maps.type'; import { type FlatAgent } from 'src/engine/metadata-modules/flat-agent/types/flat-agent.type'; @@ -37,42 +35,34 @@ import { type FlatViewMaps } from 'src/engine/metadata-modules/flat-view/types/f import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; import { type FlatWebhookMaps } from 'src/engine/metadata-modules/flat-webhook/types/flat-webhook-maps.type'; import { type FlatWebhook } from 'src/engine/metadata-modules/flat-webhook/types/flat-webhook.type'; -import { type FrontComponentEntity } from 'src/engine/metadata-modules/front-component/entities/front-component.entity'; -import { type IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; -import { type LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; import { type FlatLogicFunction } from 'src/engine/metadata-modules/logic-function/types/flat-logic-function.type'; import { type NavigationMenuItemEntity } from 'src/engine/metadata-modules/navigation-menu-item/entities/navigation-menu-item.entity'; -import { type PageLayoutTabEntity } from 'src/engine/metadata-modules/page-layout-tab/entities/page-layout-tab.entity'; -import { type PageLayoutWidgetEntity } from 'src/engine/metadata-modules/page-layout-widget/entities/page-layout-widget.entity'; -import { type PageLayoutEntity } from 'src/engine/metadata-modules/page-layout/entities/page-layout.entity'; -import { type RoleTargetEntity } from 'src/engine/metadata-modules/role-target/role-target.entity'; -import { type RoleEntity } from 'src/engine/metadata-modules/role/role.entity'; -import { type RowLevelPermissionPredicateGroupEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate-group.entity'; -import { type RowLevelPermissionPredicateEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate.entity'; import { type FlatRowLevelPermissionPredicateGroupMaps } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-group-maps.type'; import { type FlatRowLevelPermissionPredicateGroup } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-group.type'; import { type FlatRowLevelPermissionPredicateMaps } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-maps.type'; import { type FlatRowLevelPermissionPredicate } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate.type'; -import { type SkillEntity } from 'src/engine/metadata-modules/skill/entities/skill.entity'; -import { type ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; -import { type ViewFilterGroupEntity } from 'src/engine/metadata-modules/view-filter-group/entities/view-filter-group.entity'; -import { type ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; -import { type ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; -import { type ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; -import { type WebhookEntity } from 'src/engine/metadata-modules/webhook/entities/webhook.entity'; import { type UniversalFlatEntityFrom } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; +import { type UniversalFlatSkill } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-skill.type'; +import { type UniversalFlatViewField } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-field.type'; +import { type UniversalFlatViewFilterGroup } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-filter-group.type'; +import { type UniversalFlatViewFilter } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-filter.type'; +import { type UniversalFlatViewGroup } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-group.type'; +import { type UniversalFlatView } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view.type'; import { type FlatCreateAgentAction, type FlatDeleteAgentAction, type FlatUpdateAgentAction, type UniversalDeleteAgentAction, + type UniversalUpdateAgentAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service'; import { type FlatCreateCommandMenuItemAction, type FlatDeleteCommandMenuItemAction, type FlatUpdateCommandMenuItemAction, type UniversalDeleteCommandMenuItemAction, + type UniversalUpdateCommandMenuItemAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type'; import { type FlatCreateFieldAction, @@ -87,24 +77,29 @@ import { type FlatDeleteFrontComponentAction, type FlatUpdateFrontComponentAction, type UniversalDeleteFrontComponentAction, + type UniversalUpdateFrontComponentAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type'; import { + type UniversalCreateIndexAction, type FlatCreateIndexAction, type FlatDeleteIndexAction, type FlatUpdateIndexAction, type UniversalDeleteIndexAction, + type UniversalUpdateIndexAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action'; import { type FlatCreateLogicFunctionAction, type FlatDeleteLogicFunctionAction, type FlatUpdateLogicFunctionAction, type UniversalDeleteLogicFunctionAction, + type UniversalUpdateLogicFunctionAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type'; import { type FlatCreateNavigationMenuItemAction, type FlatDeleteNavigationMenuItemAction, type FlatUpdateNavigationMenuItemAction, type UniversalDeleteNavigationMenuItemAction, + type UniversalUpdateNavigationMenuItemAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type'; import { type FlatCreateObjectAction, @@ -119,84 +114,104 @@ import { type FlatDeletePageLayoutTabAction, type FlatUpdatePageLayoutTabAction, type UniversalDeletePageLayoutTabAction, + type UniversalUpdatePageLayoutTabAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type'; import { type FlatCreatePageLayoutWidgetAction, type FlatDeletePageLayoutWidgetAction, type FlatUpdatePageLayoutWidgetAction, type UniversalDeletePageLayoutWidgetAction, + type UniversalUpdatePageLayoutWidgetAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type'; import { type FlatCreatePageLayoutAction, type FlatDeletePageLayoutAction, type FlatUpdatePageLayoutAction, type UniversalDeletePageLayoutAction, + type UniversalUpdatePageLayoutAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type'; import { type FlatCreateRoleTargetAction, type FlatDeleteRoleTargetAction, type FlatUpdateRoleTargetAction, type UniversalDeleteRoleTargetAction, + type UniversalUpdateRoleTargetAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type'; import { type FlatCreateRoleAction, type FlatDeleteRoleAction, type FlatUpdateRoleAction, type UniversalDeleteRoleAction, + type UniversalUpdateRoleAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type'; import { type FlatCreateRowLevelPermissionPredicateGroupAction, type FlatDeleteRowLevelPermissionPredicateGroupAction, type FlatUpdateRowLevelPermissionPredicateGroupAction, type UniversalDeleteRowLevelPermissionPredicateGroupAction, + type UniversalUpdateRowLevelPermissionPredicateGroupAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type'; import { type FlatCreateRowLevelPermissionPredicateAction, type FlatDeleteRowLevelPermissionPredicateAction, type FlatUpdateRowLevelPermissionPredicateAction, type UniversalDeleteRowLevelPermissionPredicateAction, + type UniversalUpdateRowLevelPermissionPredicateAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type'; import { type FlatCreateSkillAction, type FlatDeleteSkillAction, type FlatUpdateSkillAction, + type UniversalCreateSkillAction, type UniversalDeleteSkillAction, + type UniversalUpdateSkillAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type'; import { type FlatCreateViewFieldAction, type FlatDeleteViewFieldAction, type FlatUpdateViewFieldAction, + type UniversalCreateViewFieldAction, type UniversalDeleteViewFieldAction, + type UniversalUpdateViewFieldAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type'; import { type FlatCreateViewFilterGroupAction, type FlatDeleteViewFilterGroupAction, type FlatUpdateViewFilterGroupAction, + type UniversalCreateViewFilterGroupAction, type UniversalDeleteViewFilterGroupAction, + type UniversalUpdateViewFilterGroupAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type'; import { type FlatCreateViewFilterAction, type FlatDeleteViewFilterAction, type FlatUpdateViewFilterAction, + type UniversalCreateViewFilterAction, type UniversalDeleteViewFilterAction, + type UniversalUpdateViewFilterAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type'; import { type FlatCreateViewGroupAction, type FlatDeleteViewGroupAction, type FlatUpdateViewGroupAction, + type UniversalCreateViewGroupAction, type UniversalDeleteViewGroupAction, + type UniversalUpdateViewGroupAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type'; import { type FlatCreateViewAction, type FlatDeleteViewAction, type FlatUpdateViewAction, + type UniversalCreateViewAction, type UniversalDeleteViewAction, + type UniversalUpdateViewAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type'; import { type FlatCreateWebhookAction, type FlatDeleteWebhookAction, type FlatUpdateWebhookAction, type UniversalDeleteWebhookAction, + type UniversalUpdateWebhookAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type'; export type AllFlatEntityTypesByMetadataName = { @@ -238,8 +253,8 @@ export type AllFlatEntityTypesByMetadataName = { view: { flatEntityMaps: FlatViewMaps; universalActions: { - create: FlatCreateViewAction; - update: FlatUpdateViewAction; + create: UniversalCreateViewAction; + update: UniversalUpdateViewAction; delete: UniversalDeleteViewAction; }; flatActions: { @@ -248,14 +263,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeleteViewAction; }; flatEntity: FlatView; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: UniversalFlatView; entity: MetadataEntity<'view'>; }; viewField: { flatEntityMaps: FlatViewFieldMaps; universalActions: { - create: FlatCreateViewFieldAction; - update: FlatUpdateViewFieldAction; + create: UniversalCreateViewFieldAction; + update: UniversalUpdateViewFieldAction; delete: UniversalDeleteViewFieldAction; }; flatActions: { @@ -264,14 +279,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeleteViewFieldAction; }; flatEntity: FlatViewField; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: UniversalFlatViewField; entity: MetadataEntity<'viewField'>; }; viewGroup: { flatEntityMaps: FlatViewGroupMaps; universalActions: { - create: FlatCreateViewGroupAction; - update: FlatUpdateViewGroupAction; + create: UniversalCreateViewGroupAction; + update: UniversalUpdateViewGroupAction; delete: UniversalDeleteViewGroupAction; }; flatActions: { @@ -280,14 +295,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeleteViewGroupAction; }; flatEntity: FlatViewGroup; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: UniversalFlatViewGroup; entity: MetadataEntity<'viewGroup'>; }; rowLevelPermissionPredicate: { flatEntityMaps: FlatRowLevelPermissionPredicateMaps; universalActions: { create: FlatCreateRowLevelPermissionPredicateAction; - update: FlatUpdateRowLevelPermissionPredicateAction; + update: UniversalUpdateRowLevelPermissionPredicateAction; delete: UniversalDeleteRowLevelPermissionPredicateAction; }; flatActions: { @@ -296,14 +311,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeleteRowLevelPermissionPredicateAction; }; flatEntity: FlatRowLevelPermissionPredicate; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: FlatRowLevelPermissionPredicate; entity: MetadataEntity<'rowLevelPermissionPredicate'>; }; rowLevelPermissionPredicateGroup: { flatEntityMaps: FlatRowLevelPermissionPredicateGroupMaps; universalActions: { create: FlatCreateRowLevelPermissionPredicateGroupAction; - update: FlatUpdateRowLevelPermissionPredicateGroupAction; + update: UniversalUpdateRowLevelPermissionPredicateGroupAction; delete: UniversalDeleteRowLevelPermissionPredicateGroupAction; }; flatActions: { @@ -312,14 +327,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeleteRowLevelPermissionPredicateGroupAction; }; flatEntity: FlatRowLevelPermissionPredicateGroup; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: FlatRowLevelPermissionPredicateGroup; entity: MetadataEntity<'rowLevelPermissionPredicateGroup'>; }; viewFilterGroup: { flatEntityMaps: FlatViewFilterGroupMaps; universalActions: { - create: FlatCreateViewFilterGroupAction; - update: FlatUpdateViewFilterGroupAction; + create: UniversalCreateViewFilterGroupAction; + update: UniversalUpdateViewFilterGroupAction; delete: UniversalDeleteViewFilterGroupAction; }; flatActions: { @@ -328,14 +343,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeleteViewFilterGroupAction; }; flatEntity: FlatViewFilterGroup; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: UniversalFlatViewFilterGroup; entity: MetadataEntity<'viewFilterGroup'>; }; index: { flatEntityMaps: FlatEntityMaps; universalActions: { - create: FlatCreateIndexAction; - update: FlatUpdateIndexAction; + create: UniversalCreateIndexAction; + update: UniversalUpdateIndexAction; delete: UniversalDeleteIndexAction; }; flatActions: { @@ -344,14 +359,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeleteIndexAction; }; flatEntity: FlatIndexMetadata; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: UniversalFlatIndexMetadata; entity: MetadataEntity<'index'>; }; logicFunction: { flatEntityMaps: FlatEntityMaps; universalActions: { create: FlatCreateLogicFunctionAction; - update: FlatUpdateLogicFunctionAction; + update: UniversalUpdateLogicFunctionAction; delete: UniversalDeleteLogicFunctionAction; }; flatActions: { @@ -360,14 +375,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeleteLogicFunctionAction; }; flatEntity: FlatLogicFunction; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: FlatLogicFunction; entity: MetadataEntity<'logicFunction'>; }; viewFilter: { flatEntityMaps: FlatViewFilterMaps; universalActions: { - create: FlatCreateViewFilterAction; - update: FlatUpdateViewFilterAction; + create: UniversalCreateViewFilterAction; + update: UniversalUpdateViewFilterAction; delete: UniversalDeleteViewFilterAction; }; flatActions: { @@ -376,14 +391,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeleteViewFilterAction; }; flatEntity: FlatViewFilter; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: UniversalFlatViewFilter; entity: MetadataEntity<'viewFilter'>; }; role: { flatEntityMaps: FlatEntityMaps; universalActions: { create: FlatCreateRoleAction; - update: FlatUpdateRoleAction; + update: UniversalUpdateRoleAction; delete: UniversalDeleteRoleAction; }; flatActions: { @@ -392,14 +407,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeleteRoleAction; }; flatEntity: FlatRole; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: FlatRole; entity: MetadataEntity<'role'>; }; roleTarget: { flatEntityMaps: FlatRoleTargetMaps; universalActions: { create: FlatCreateRoleTargetAction; - update: FlatUpdateRoleTargetAction; + update: UniversalUpdateRoleTargetAction; delete: UniversalDeleteRoleTargetAction; }; flatActions: { @@ -408,14 +423,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeleteRoleTargetAction; }; flatEntity: FlatRoleTarget; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: FlatRoleTarget; entity: MetadataEntity<'roleTarget'>; }; agent: { flatEntityMaps: FlatAgentMaps; universalActions: { create: FlatCreateAgentAction; - update: FlatUpdateAgentAction; + update: UniversalUpdateAgentAction; delete: UniversalDeleteAgentAction; }; flatActions: { @@ -424,14 +439,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeleteAgentAction; }; flatEntity: FlatAgent; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: FlatAgent; entity: MetadataEntity<'agent'>; }; skill: { flatEntityMaps: FlatSkillMaps; universalActions: { - create: FlatCreateSkillAction; - update: FlatUpdateSkillAction; + create: UniversalCreateSkillAction; + update: UniversalUpdateSkillAction; delete: UniversalDeleteSkillAction; }; flatActions: { @@ -440,14 +455,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeleteSkillAction; }; flatEntity: FlatSkill; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: UniversalFlatSkill; entity: MetadataEntity<'skill'>; }; commandMenuItem: { flatEntityMaps: FlatCommandMenuItemMaps; universalActions: { create: FlatCreateCommandMenuItemAction; - update: FlatUpdateCommandMenuItemAction; + update: UniversalUpdateCommandMenuItemAction; delete: UniversalDeleteCommandMenuItemAction; }; flatActions: { @@ -456,14 +471,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeleteCommandMenuItemAction; }; flatEntity: FlatCommandMenuItem; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: FlatCommandMenuItem; entity: MetadataEntity<'commandMenuItem'>; }; navigationMenuItem: { flatEntityMaps: FlatNavigationMenuItemMaps; universalActions: { create: FlatCreateNavigationMenuItemAction; - update: FlatUpdateNavigationMenuItemAction; + update: UniversalUpdateNavigationMenuItemAction; delete: UniversalDeleteNavigationMenuItemAction; }; flatActions: { @@ -472,14 +487,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeleteNavigationMenuItemAction; }; flatEntity: FlatNavigationMenuItem; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: FlatNavigationMenuItem; entity: NavigationMenuItemEntity; }; pageLayout: { flatEntityMaps: FlatPageLayoutMaps; universalActions: { create: FlatCreatePageLayoutAction; - update: FlatUpdatePageLayoutAction; + update: UniversalUpdatePageLayoutAction; delete: UniversalDeletePageLayoutAction; }; flatActions: { @@ -488,14 +503,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeletePageLayoutAction; }; flatEntity: FlatPageLayout; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: FlatPageLayout; entity: MetadataEntity<'pageLayout'>; }; pageLayoutWidget: { flatEntityMaps: FlatPageLayoutWidgetMaps; universalActions: { create: FlatCreatePageLayoutWidgetAction; - update: FlatUpdatePageLayoutWidgetAction; + update: UniversalUpdatePageLayoutWidgetAction; delete: UniversalDeletePageLayoutWidgetAction; }; flatActions: { @@ -504,17 +519,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeletePageLayoutWidgetAction; }; flatEntity: FlatPageLayoutWidget; - universalFlatEntity: UniversalFlatEntityFrom< - PageLayoutWidgetEntity, - 'pageLayoutWidget' - >; + universalFlatEntity: FlatPageLayoutWidget; entity: MetadataEntity<'pageLayoutWidget'>; }; pageLayoutTab: { flatEntityMaps: FlatPageLayoutTabMaps; universalActions: { create: FlatCreatePageLayoutTabAction; - update: FlatUpdatePageLayoutTabAction; + update: UniversalUpdatePageLayoutTabAction; delete: UniversalDeletePageLayoutTabAction; }; flatActions: { @@ -523,14 +535,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeletePageLayoutTabAction; }; flatEntity: FlatPageLayoutTab; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: FlatPageLayoutTab; entity: MetadataEntity<'pageLayoutTab'>; }; frontComponent: { flatEntityMaps: FlatFrontComponentMaps; universalActions: { create: FlatCreateFrontComponentAction; - update: FlatUpdateFrontComponentAction; + update: UniversalUpdateFrontComponentAction; delete: UniversalDeleteFrontComponentAction; }; flatActions: { @@ -539,14 +551,14 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeleteFrontComponentAction; }; flatEntity: FlatFrontComponent; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: FlatFrontComponent; entity: MetadataEntity<'frontComponent'>; }; webhook: { flatEntityMaps: FlatWebhookMaps; universalActions: { create: FlatCreateWebhookAction; - update: FlatUpdateWebhookAction; + update: UniversalUpdateWebhookAction; delete: UniversalDeleteWebhookAction; }; flatActions: { @@ -555,7 +567,7 @@ export type AllFlatEntityTypesByMetadataName = { delete: FlatDeleteWebhookAction; }; flatEntity: FlatWebhook; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: FlatWebhook; entity: MetadataEntity<'webhook'>; }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type.ts index 4020f35414..56220f1275 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type.ts @@ -1,10 +1,8 @@ import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type'; -import { type UniversalSyncableFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; -export type FlatEntityMaps< - T extends SyncableFlatEntity | UniversalSyncableFlatEntity, -> = { - byUniversalIdentifier: Partial>; - universalIdentifierById: Partial>; - universalIdentifiersByApplicationId: Partial>; -}; +export type FlatEntityMaps = + UniversalFlatEntityMaps & { + universalIdentifierById: Partial>; + universalIdentifiersByApplicationId: Partial>; + }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-properties-to-compare.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-properties-to-compare.type.ts deleted file mode 100644 index 81335a4fb2..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-properties-to-compare.type.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { type AllMetadataName } from 'twenty-shared/metadata'; - -import { type ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY } from 'src/engine/metadata-modules/flat-entity/constant/all-flat-entity-properties-to-compare-and-stringify.constant'; - -export type FlatEntityPropertiesToCompare = - (typeof ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY)[T]['propertiesToCompare'][number]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-properties-to-stringify.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-properties-to-stringify.type.ts deleted file mode 100644 index 03d3d577d6..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-properties-to-stringify.type.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { type AllMetadataName } from 'twenty-shared/metadata'; - -import { type ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY } from 'src/engine/metadata-modules/flat-entity/constant/all-flat-entity-properties-to-compare-and-stringify.constant'; - -export type FlatEntityPropertiesToStringify = - (typeof ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY)[T]['propertiesToStringify'][number]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type.ts deleted file mode 100644 index 95f33071ba..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { type AllMetadataName } from 'twenty-shared/metadata'; - -import { type FlatEntityPropertiesToCompare } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-to-compare.type'; -import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; - -export type MetadataFlatEntityComparableProperties = - Extract, keyof MetadataFlatEntity>; - -export type FlatEntityUpdate = Partial< - Pick, MetadataFlatEntityComparableProperties> ->; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-to-create-delete-update.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-to-create-delete-update.type.ts index 13903f0b09..5656884315 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-to-create-delete-update.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-to-create-delete-update.type.ts @@ -1,9 +1,9 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; -import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; +import { type MetadataUniversalFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-universal-flat-entity.type'; export type FlatEntityToCreateDeleteUpdate = { - flatEntityToUpdate: MetadataFlatEntity[]; - flatEntityToCreate: MetadataFlatEntity[]; - flatEntityToDelete: MetadataFlatEntity[]; + flatEntityToUpdate: MetadataUniversalFlatEntity[]; + flatEntityToCreate: (MetadataUniversalFlatEntity & { id?: string })[]; + flatEntityToDelete: MetadataUniversalFlatEntity[]; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-update.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-update.type.ts new file mode 100644 index 0000000000..d9adacc740 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-update.type.ts @@ -0,0 +1,27 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type ALL_ENTITY_PROPERTIES_CONFIGURATION_BY_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; +import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; + +type IsUniversalMappedProperty< + MetadataConfig, + P extends keyof MetadataConfig, +> = MetadataConfig[P] extends { universalProperty: string } + ? MetadataConfig[P]['universalProperty'] + : never; + +export type FlatEntityUpdate< + T extends AllMetadataName, + MetadataPropertyConfig = (typeof ALL_ENTITY_PROPERTIES_CONFIGURATION_BY_METADATA_NAME)[T], +> = Partial< + Pick< + MetadataFlatEntity, + Extract, keyof MetadataPropertyConfig> + > +> & { + [K in keyof MetadataPropertyConfig as [ + never, + ] extends IsUniversalMappedProperty + ? never + : IsUniversalMappedProperty]?: never; +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-and-related-flat-entity-maps-for-validation.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-and-related-flat-entity-maps-for-validation.type.ts index 4a7326b7b4..1330ab2bdb 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-and-related-flat-entity-maps-for-validation.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-and-related-flat-entity-maps-for-validation.type.ts @@ -1,14 +1,14 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; -import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { type MetadataRelatedFlatEntityMapsKeys } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-flat-entity-maps-keys.type'; import { type MetadataToFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/types/metadata-to-flat-entity-maps-key'; import { type MetadataValidationRelatedMetadataNames } from 'src/engine/metadata-modules/flat-entity/types/metadata-validation-related-metadata-names.type'; +import { type AllUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/all-universal-flat-entity-maps.type'; -export type MetadataFlatEntityAndRelatedFlatEntityMapsForValidation< +export type MetadataUniversalFlatEntityAndRelatedFlatEntityMapsForValidation< T extends AllMetadataName, > = Pick< - AllFlatEntityMaps, + AllUniversalFlatEntityMaps, | MetadataRelatedFlatEntityMapsKeys | MetadataToFlatEntityMapsKey | MetadataToFlatEntityMapsKey> diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/metadata-related-types.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/metadata-related-types.type.ts index b618224c2f..dedb55b4a8 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/metadata-related-types.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/metadata-related-types.type.ts @@ -4,6 +4,14 @@ import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/ import { type MetadataRelatedFlatEntityMapsKeys } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-flat-entity-maps-keys.type'; import { type MetadataToFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/types/metadata-to-flat-entity-maps-key'; import { type MetadataValidationRelatedMetadataNames } from 'src/engine/metadata-modules/flat-entity/types/metadata-validation-related-metadata-names.type'; +import { type AllUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/all-universal-flat-entity-maps.type'; + +export type MetadataUniversalFlatEntityAndRelatedUniversalFlatEntityMaps< + T extends AllMetadataName, +> = Pick< + AllUniversalFlatEntityMaps, + MetadataRelatedFlatEntityMapsKeys | MetadataToFlatEntityMapsKey +>; export type MetadataFlatEntityAndRelatedFlatEntityMaps< T extends AllMetadataName, @@ -12,11 +20,13 @@ export type MetadataFlatEntityAndRelatedFlatEntityMaps< MetadataRelatedFlatEntityMapsKeys | MetadataToFlatEntityMapsKey >; -export type MetadataValidationRelatedFlatEntityMaps = +export type MetadataValidationRelatedUniversalFlatEntityMaps< + T extends AllMetadataName, +> = MetadataValidationRelatedMetadataNames extends undefined ? undefined : Pick< - AllFlatEntityMaps, + AllUniversalFlatEntityMaps, MetadataToFlatEntityMapsKey< NonNullable> > diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.spec.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.spec.ts index df894d2290..ceed706265 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.spec.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.spec.ts @@ -4,7 +4,7 @@ import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-enti import { type MetadataFlatEntityAndRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; import { addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.util'; import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock'; @@ -12,14 +12,18 @@ import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; describe('addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow', () => { - it('should add a view and update related objectMetadata with viewId', () => { + it('should add a view and update related objectMetadata and fieldMetadata with both id and universal identifier aggregators', () => { const objectMetadataId = 'object-1'; const viewId = 'view-1'; const applicationId = '20202020-f3ad-452e-b5b6-2d49d3ea88b1'; const workspaceId = '20202020-bc64-4148-8a79-b3144f743694'; + const objectUniversalIdentifier = 'object-universal-1'; + const fieldUniversalIdentifier = 'field-universal-1'; + const viewUniversalIdentifier = 'view-universal-1'; + const mockObjectMetadata = getFlatObjectMetadataMock({ id: objectMetadataId, - universalIdentifier: 'object-universal-1', + universalIdentifier: objectUniversalIdentifier, viewIds: [], fieldIds: [], workspaceId, @@ -34,7 +38,7 @@ describe('addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow', type: FieldMetadataType.DATE, workspaceId, applicationId, - universalIdentifier: 'field-universal-1', + universalIdentifier: fieldUniversalIdentifier, viewFieldIds: [], viewFilterIds: [], calendarViewIds: [], @@ -44,13 +48,15 @@ describe('addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow', const mockView: Pick & Partial = { id: viewId, workspaceId, - universalIdentifier: 'view-universal-1', + universalIdentifier: viewUniversalIdentifier, objectMetadataId: objectMetadataId, + objectMetadataUniversalIdentifier: objectUniversalIdentifier, viewFieldIds: [], viewFilterIds: [], viewGroupIds: [], applicationId, calendarFieldMetadataId: mockFieldMetadata.id, + calendarFieldMetadataUniversalIdentifier: fieldUniversalIdentifier, }; const flatEntityAndRelatedMapsToMutate: MetadataFlatEntityAndRelatedFlatEntityMaps<'view'> = @@ -73,28 +79,30 @@ describe('addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow', }); expect( - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: mockView.id, + findFlatEntityByUniversalIdentifier({ + universalIdentifier: viewUniversalIdentifier, flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatViewMaps, }), ).toMatchObject(mockView); expect( - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: objectMetadataId, + findFlatEntityByUniversalIdentifier({ + universalIdentifier: objectUniversalIdentifier, flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatObjectMetadataMaps, }), ).toMatchObject>({ viewIds: [mockView.id], + viewUniversalIdentifiers: [viewUniversalIdentifier], }); expect( - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: mockFieldMetadata.id, + findFlatEntityByUniversalIdentifier({ + universalIdentifier: fieldUniversalIdentifier, flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatFieldMetadataMaps, }), ).toMatchObject>({ calendarViewIds: [mockView.id], + calendarViewUniversalIdentifiers: [viewUniversalIdentifier], }); }); }); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.spec.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.spec.ts index 504850802b..95443fc83c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.spec.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.spec.ts @@ -4,7 +4,7 @@ import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-enti import { type MetadataFlatEntityAndRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util'; import { deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.util'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock'; @@ -12,16 +12,20 @@ import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; describe('deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThrow', () => { - it('should delete a view and update related objectMetadata and fieldMetadata by removing viewId', () => { + it('should delete a view and update related objectMetadata and fieldMetadata by removing both id and universal identifier aggregators', () => { const objectMetadataId = 'object-1'; const viewId = 'view-1'; const applicationId = '20202020-f3ad-452e-b5b6-2d49d3ea88b1'; const workspaceId = '20202020-bc64-4148-8a79-b3144f743694'; + const objectUniversalIdentifier = 'object-universal-1'; + const fieldUniversalIdentifier = 'field-universal-1'; + const viewUniversalIdentifier = 'view-universal-1'; const mockObjectMetadata = getFlatObjectMetadataMock({ id: objectMetadataId, - universalIdentifier: 'object-universal-1', + universalIdentifier: objectUniversalIdentifier, viewIds: [viewId, 'something-else'], + viewUniversalIdentifiers: [viewUniversalIdentifier, 'something-else-ui'], fieldIds: [], workspaceId, imageIdentifierFieldMetadataId: '20202020-9d65-415f-b0e1-216a2e257ea4', @@ -33,24 +37,27 @@ describe('deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThr objectMetadataId, id: '20202020-4087-423b-852a-91f91acf2df2', type: FieldMetadataType.DATE, - universalIdentifier: 'field-universal-1', + universalIdentifier: fieldUniversalIdentifier, viewFieldIds: [], viewFilterIds: [], workspaceId, calendarViewIds: [viewId], + calendarViewUniversalIdentifiers: [viewUniversalIdentifier], mainGroupByFieldMetadataViewIds: [], applicationId, }); const mockView: Partial = { id: viewId, - universalIdentifier: 'view-universal-1', + universalIdentifier: viewUniversalIdentifier, objectMetadataId: objectMetadataId, + objectMetadataUniversalIdentifier: objectUniversalIdentifier, viewFieldIds: [], viewFilterIds: [], viewGroupIds: [], workspaceId, calendarFieldMetadataId: mockFieldMetadata.id, + calendarFieldMetadataUniversalIdentifier: fieldUniversalIdentifier, createdAt: new Date('2024-01-01').toISOString(), updatedAt: new Date('2024-01-01').toISOString(), icon: 'icon', @@ -83,28 +90,30 @@ describe('deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThr }); expect( - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: viewId, + findFlatEntityByUniversalIdentifier({ + universalIdentifier: viewUniversalIdentifier, flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatViewMaps, }), ).toBeUndefined(); expect( - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: objectMetadataId, + findFlatEntityByUniversalIdentifier({ + universalIdentifier: objectUniversalIdentifier, flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatObjectMetadataMaps, }), ).toMatchObject>({ viewIds: ['something-else'], + viewUniversalIdentifiers: ['something-else-ui'], }); expect( - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: mockFieldMetadata.id, + findFlatEntityByUniversalIdentifier({ + universalIdentifier: fieldUniversalIdentifier, flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatFieldMetadataMaps, }), ).toMatchObject>({ calendarViewIds: [], + calendarViewUniversalIdentifiers: [], }); }); }); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts index ab18c9363b..706f1f5d3b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts @@ -12,7 +12,7 @@ import { type MetadataRelatedFlatEntityMapsKeys } from 'src/engine/metadata-modu import { type MetadataFlatEntityAndRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; -import { addFlatEntityToFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/add-flat-entity-to-flat-entity-maps-through-mutation-or-throw.util'; +import { addUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util'; import { replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/replace-flat-entity-in-flat-entity-maps-through-mutation-or-throw.util'; type AddFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrowArgs< @@ -22,21 +22,30 @@ type AddFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrowArgs< flatEntity: MetadataFlatEntity; flatEntityAndRelatedMapsToMutate: MetadataFlatEntityAndRelatedFlatEntityMaps; }; + export const addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow = ({ metadataName, flatEntity, flatEntityAndRelatedMapsToMutate, }: AddFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrowArgs) => { + addUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow( + { + metadataName, + universalFlatEntity: flatEntity, + universalFlatEntityAndRelatedMapsToMutate: + flatEntityAndRelatedMapsToMutate, + }, + ); + const flatEntityMapsKey = getMetadataFlatEntityMapsKey(metadataName); + const selfFlatEntityMaps = + flatEntityAndRelatedMapsToMutate[flatEntityMapsKey]; - addFlatEntityToFlatEntityMapsThroughMutationOrThrow({ - flatEntity, - flatEntityMapsToMutate: - flatEntityAndRelatedMapsToMutate[flatEntityMapsKey], - }); + selfFlatEntityMaps.universalIdentifierById[flatEntity.id] = + flatEntity.universalIdentifier; - const manyToOneRelations = Object.values( + const idBasedManyToOneRelations = Object.values( ALL_METADATA_RELATIONS[metadataName].manyToOne, ) as Array<{ metadataName: AllMetadataName; @@ -44,8 +53,8 @@ export const addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow foreignKey: keyof MetadataFlatEntity; } | null>; - for (const relation of manyToOneRelations) { - if (!isDefined(relation)) { + for (const idBasedRelation of idBasedManyToOneRelations) { + if (!isDefined(idBasedRelation)) { continue; } @@ -53,7 +62,7 @@ export const addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow metadataName: relatedMetadataName, flatEntityForeignKeyAggregator, foreignKey, - } = relation; + } = idBasedRelation; if (!isDefined(flatEntityForeignKeyAggregator)) { continue; @@ -61,6 +70,7 @@ export const addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow const relatedFlatEntityMapsKey = getMetadataFlatEntityMapsKey(relatedMetadataName); + const relatedFlatEntityMetadataMaps = flatEntityAndRelatedMapsToMutate[ relatedFlatEntityMapsKey as MetadataRelatedFlatEntityMapsKeys ] as FlatEntityMaps>; @@ -85,7 +95,7 @@ export const addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow ) ) { throw new FlatEntityMapsException( - `Should never occur, invalid flat entity typing. flat ${metadataName} should contain ${flatEntityForeignKeyAggregator}`, + `Should never occur, invalid flat entity typing. flat ${relatedMetadataName} should contain ${String(flatEntityForeignKeyAggregator)}`, FlatEntityMapsExceptionCode.ENTITY_MALFORMED, ); } diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/compare-two-flat-entity.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/compare-two-flat-entity.util.ts deleted file mode 100644 index 0e7d6b0c40..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/compare-two-flat-entity.util.ts +++ /dev/null @@ -1,78 +0,0 @@ -import diff from 'microdiff'; -import { type AllMetadataName } from 'twenty-shared/metadata'; -import { type FromTo } from 'twenty-shared/types'; -import { parseJson } from 'twenty-shared/utils'; - -import { type FlatEntityPropertiesToCompare } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-to-compare.type'; -import { type FlatEntityUpdate } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type'; -import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; -import { transformFlatEntityForComparison } from 'src/engine/metadata-modules/flat-entity/utils/transform-flat-entity-for-comparison.util'; - -export const compareTwoFlatEntity = < - T extends AllMetadataName, - PToCompare extends Extract< - FlatEntityPropertiesToCompare, - keyof MetadataFlatEntity - >, - PJsonB extends PToCompare = PToCompare, ->({ - fromFlatEntity, - toFlatEntity, - propertiesToCompare, - propertiesToStringify, -}: FromTo, 'flatEntity'> & { - propertiesToCompare: readonly PToCompare[]; - propertiesToStringify: readonly PJsonB[]; -}): FlatEntityUpdate | undefined => { - const [transformedFromFlatEntity, transformedToFlatEntity] = [ - fromFlatEntity, - toFlatEntity, - ].map((flatEntity) => - transformFlatEntityForComparison({ - flatEntity, - propertiesToCompare, - propertiesToStringify, - }), - ); - - const flatEntityDifferences = diff( - transformedFromFlatEntity, - transformedToFlatEntity, - ); - - if (flatEntityDifferences.length === 0) { - return undefined; - } - - const initialAccumulator: FlatEntityUpdate = {}; - - return flatEntityDifferences.reduce((accumulator, difference) => { - switch (difference.type) { - case 'CHANGE': { - const { path, value } = difference; - const property = path[0] as PToCompare; - const isJsonb = propertiesToStringify.includes( - property as unknown as PJsonB, - ); - - if (isJsonb) { - return { - ...accumulator, - [property]: parseJson(value), - }; - } - - return { - ...accumulator, - [property]: value, - }; - } - case 'CREATE': - case 'REMOVE': - default: { - // Should never occur, we should only provide null never undefined and so on - return accumulator; - } - } - }, initialAccumulator); -}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/compute-flat-entity-maps-from-to.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/compute-flat-entity-maps-from-to.util.ts deleted file mode 100644 index 5bd6c4daeb..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/compute-flat-entity-maps-from-to.util.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { type AllMetadataName } from 'twenty-shared/metadata'; - -import { type FlatEntityToCreateDeleteUpdate } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-to-create-delete-update.type'; -import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; -import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util'; -import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util'; -import { getSubFlatEntityByIdsMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-by-ids-maps-or-throw.util'; -import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util'; - -export type ComputeFlatEntityMapsFromToArgs = { - flatEntityMaps: MetadataFlatEntityMaps; -} & FlatEntityToCreateDeleteUpdate; -export const computeFlatEntityMapsFromTo = ({ - flatEntityMaps, - flatEntityToCreate, - flatEntityToDelete, - flatEntityToUpdate, -}: ComputeFlatEntityMapsFromToArgs): { - from: MetadataFlatEntityMaps; - to: MetadataFlatEntityMaps; -} => { - const fromFlatEntityMaps = - flatEntityToDelete.length > 0 - ? getSubFlatEntityByIdsMapsOrThrow({ - flatEntityIds: [...flatEntityToDelete, ...flatEntityToUpdate].map( - ({ id }) => id, - ), - flatEntityMaps, - }) - : flatEntityMaps; - - const toFlatEntityMapsWithDeleted = flatEntityToDelete.reduce( - (flatEntityMaps, flatEntity) => - deleteFlatEntityFromFlatEntityMapsOrThrow({ - entityToDeleteId: flatEntity.id, - flatEntityMaps, - }), - fromFlatEntityMaps, - ); - - const toFlatEntityMapsWithUpdated = flatEntityToUpdate.reduce( - (flatEntityMaps, flatEntity) => - replaceFlatEntityInFlatEntityMapsOrThrow({ - flatEntity, - flatEntityMaps, - }), - toFlatEntityMapsWithDeleted, - ); - - const toFlatEntityMaps = flatEntityToCreate.reduce( - (flatEntityMaps, flatEntity) => - addFlatEntityToFlatEntityMapsOrThrow({ - flatEntity, - flatEntityMaps, - }), - toFlatEntityMapsWithUpdated, - ); - - return { - from: fromFlatEntityMaps, - to: toFlatEntityMaps, - }; -}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts index a2c92bb002..7b50f59109 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts @@ -12,7 +12,7 @@ import { type MetadataRelatedFlatEntityMapsKeys } from 'src/engine/metadata-modu import { type MetadataFlatEntityAndRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; -import { deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/delete-flat-entity-from-flat-entity-maps-through-mutation-or-throw.util'; +import { deleteUniversalFlatEntityFromUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/delete-universal-flat-entity-from-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util'; import { replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/replace-flat-entity-in-flat-entity-maps-through-mutation-or-throw.util'; type DeleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThrowArgs< @@ -22,23 +22,23 @@ type DeleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThrowArg flatEntity: MetadataFlatEntity; flatEntityAndRelatedMapsToMutate: MetadataFlatEntityAndRelatedFlatEntityMaps; }; + export const deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThrow = ({ metadataName, flatEntity, flatEntityAndRelatedMapsToMutate, }: DeleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThrowArgs) => { - const flatEntityMapsKey = getMetadataFlatEntityMapsKey(metadataName); + deleteUniversalFlatEntityFromUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow( + { + metadataName, + universalFlatEntity: flatEntity, + universalFlatEntityAndRelatedMapsToMutate: + flatEntityAndRelatedMapsToMutate, + }, + ); - deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow< - MetadataFlatEntity - >({ - entityToDeleteId: flatEntity.id, - flatEntityMapsToMutate: - flatEntityAndRelatedMapsToMutate[flatEntityMapsKey], - }); - - const manyToOneRelations = Object.values( + const idBasedManyToOneRelations = Object.values( ALL_METADATA_RELATIONS[metadataName].manyToOne, ) as Array<{ metadataName: AllMetadataName; @@ -46,8 +46,8 @@ export const deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOr foreignKey: keyof MetadataFlatEntity; } | null>; - for (const relation of manyToOneRelations) { - if (!isDefined(relation)) { + for (const idBasedRelation of idBasedManyToOneRelations) { + if (!isDefined(idBasedRelation)) { continue; } @@ -55,7 +55,7 @@ export const deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOr metadataName: relatedMetadataName, flatEntityForeignKeyAggregator, foreignKey, - } = relation; + } = idBasedRelation; if (!isDefined(flatEntityForeignKeyAggregator)) { continue; @@ -92,7 +92,7 @@ export const deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOr ) ) { throw new FlatEntityMapsException( - `Should never occur, invalid flat entity typing. flat ${metadataName} should contain ${flatEntityForeignKeyAggregator}`, + `Should never occur, invalid flat entity typing. flat ${relatedMetadataName} should contain ${flatEntityForeignKeyAggregator}`, FlatEntityMapsExceptionCode.ENTITY_MALFORMED, ); } diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util.ts index 11c2384d60..8c8b0bd064 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util.ts @@ -5,9 +5,9 @@ import { FlatEntityMapsExceptionCode, } from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type'; -import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { type UniversalSyncableFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; export const findFlatEntityByUniversalIdentifierOrThrow = < T extends SyncableFlatEntity | UniversalSyncableFlatEntity, @@ -15,7 +15,7 @@ export const findFlatEntityByUniversalIdentifierOrThrow = < flatEntityMaps, universalIdentifier, }: { - flatEntityMaps: FlatEntityMaps; + flatEntityMaps: UniversalFlatEntityMaps; universalIdentifier: string; }): T => { const flatEntity = findFlatEntityByUniversalIdentifier({ diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util.ts index 3859335f35..4f8545daf7 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util.ts @@ -1,6 +1,6 @@ import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type'; -import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { type UniversalSyncableFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; export const findFlatEntityByUniversalIdentifier = < T extends SyncableFlatEntity | UniversalSyncableFlatEntity, @@ -8,7 +8,7 @@ export const findFlatEntityByUniversalIdentifier = < flatEntityMaps, universalIdentifier, }: { - flatEntityMaps: FlatEntityMaps; + flatEntityMaps: UniversalFlatEntityMaps; universalIdentifier: string; }): T | undefined => { return flatEntityMaps.byUniversalIdentifier[universalIdentifier]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-universal-identifier-in-universal-flat-entity-maps-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-universal-identifier-in-universal-flat-entity-maps-or-throw.util.ts index 29e79a4bf6..e1b0bd9b55 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-universal-identifier-in-universal-flat-entity-maps-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-universal-identifier-in-universal-flat-entity-maps-or-throw.util.ts @@ -1,12 +1,12 @@ import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type'; -import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { type UniversalSyncableFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; export type FindManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrowArgs< T extends SyncableFlatEntity | UniversalSyncableFlatEntity, > = { - flatEntityMaps: FlatEntityMaps; + flatEntityMaps: UniversalFlatEntityMaps; universalIdentifiers: string[]; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-metadata-serialized-relation-names.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-metadata-serialized-relation-names.util.ts new file mode 100644 index 0000000000..db1f6222fc --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-metadata-serialized-relation-names.util.ts @@ -0,0 +1,15 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { ALL_METADATA_RELATIONS } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-relations.constant'; + +export const getMetadataSerializedRelationNames = ( + metadataName: AllMetadataName, +): AllMetadataName[] => { + const relations = ALL_METADATA_RELATIONS[metadataName]; + + if (!('serializedRelations' in relations)) { + return []; + } + + return Object.keys(relations.serializedRelations) as AllMetadataName[]; +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-sub-universal-flat-entity-by-universal-identifiers-maps-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-sub-universal-flat-entity-by-universal-identifiers-maps-or-throw.util.ts new file mode 100644 index 0000000000..6be2e41c62 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-sub-universal-flat-entity-by-universal-identifiers-maps-or-throw.util.ts @@ -0,0 +1,33 @@ +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; +import { type UniversalSyncableFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; +import { addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-maps-through-mutation-or-throw.util'; + +export const getSubUniversalFlatEntityByUniversalIdentifiersMapsOrThrow = < + T extends SyncableFlatEntity | UniversalSyncableFlatEntity, +>({ + universalIdentifiers, + universalFlatEntityMaps, +}: { + universalFlatEntityMaps: UniversalFlatEntityMaps; + universalIdentifiers: string[]; +}): UniversalFlatEntityMaps => { + const subUniversalFlatEntityMaps: UniversalFlatEntityMaps = { + byUniversalIdentifier: {}, + }; + + for (const universalIdentifier of universalIdentifiers) { + const flatEntity = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: universalFlatEntityMaps, + universalIdentifier, + }); + + addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow({ + universalFlatEntity: flatEntity, + universalFlatEntityMapsToMutate: subUniversalFlatEntityMaps, + }); + } + + return subUniversalFlatEntityMaps; +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util.ts index ca131b3cbb..e567b3ec88 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util.ts @@ -4,7 +4,7 @@ import { isDefined } from 'twenty-shared/utils'; import { ALL_METADATA_RELATIONS, - type ManyToOneRelationValue, + type MetadataManyToOneRelationConfiguration, } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-relations.constant'; import { FlatEntityMapsException, @@ -76,7 +76,9 @@ export const resolveEntityRelationUniversalIdentifiers = < const relations = ALL_METADATA_RELATIONS[metadataName].manyToOne; const result: Record = {}; - for (const relation of Object.values(relations) as ManyToOneRelationValue< + for (const relation of Object.values( + relations, + ) as MetadataManyToOneRelationConfiguration< T, ExtractEntityManyToOneEntityRelationProperties> >[]) { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/resolve-universal-identifier-from-flat-entity-id-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/resolve-universal-identifier-from-flat-entity-id-or-throw.util.ts deleted file mode 100644 index 4362be7dc9..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/resolve-universal-identifier-from-flat-entity-id-or-throw.util.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { t } from '@lingui/core/macro'; -import { type AllMetadataName } from 'twenty-shared/metadata'; -import { isDefined } from 'twenty-shared/utils'; - -import { - FlatEntityMapsException, - FlatEntityMapsExceptionCode, -} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; -import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; - -// @deprecated Use resolveEntityRelationUniversalIdentifiers instead -export const resolveUniversalIdentifierFromFlatEntityIdOrThrow = < - T extends AllMetadataName, ->({ - flatEntityMaps, - flatEntityId, - metadataName, -}: { - flatEntityMaps: MetadataFlatEntityMaps; - flatEntityId: string; - metadataName: T; -}): string => { - const flatEntity = findFlatEntityByIdInFlatEntityMaps({ - flatEntityMaps, - flatEntityId, - }); - - if (!isDefined(flatEntity)) { - throw new FlatEntityMapsException( - t`Could not find ${metadataName}`, - FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND, - ); - } - - return flatEntity.universalIdentifier; -}; - -// @deprecated Use resolveEntityRelationUniversalIdentifiers instead -export const resolveNullableUniversalIdentifierFromFlatEntityId = < - T extends AllMetadataName, ->({ - flatEntityMaps, - flatEntityId, - metadataName, -}: { - flatEntityMaps: MetadataFlatEntityMaps; - flatEntityId: string | null | undefined; - metadataName: T; -}): string | null => { - if (!isDefined(flatEntityId)) { - return null; - } - - return resolveUniversalIdentifierFromFlatEntityIdOrThrow({ - flatEntityMaps, - flatEntityId, - metadataName, - }); -}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/transform-flat-entity-for-comparison.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/transform-flat-entity-for-comparison.util.ts deleted file mode 100644 index 8347239061..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/transform-flat-entity-for-comparison.util.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type'; -import { orderObjectProperties } from 'src/engine/metadata-modules/flat-entity/utils/order-object-properties.util'; - -export function transformFlatEntityForComparison< - TFlatEntity extends SyncableFlatEntity, - PToCompare extends keyof TFlatEntity, - PJsonB extends PToCompare, ->({ - flatEntity, - propertiesToCompare, - propertiesToStringify, -}: { - flatEntity: TFlatEntity; - propertiesToCompare: readonly PToCompare[]; - propertiesToStringify: readonly PJsonB[]; -}): Pick { - return propertiesToCompare.reduce( - (flatEntityAccumulator, propertyToCompare) => { - const currentValue = flatEntity[propertyToCompare]; - - if (propertiesToStringify.includes(propertyToCompare as PJsonB)) { - const orderedValue = orderObjectProperties(currentValue); - - return { - ...flatEntityAccumulator, - [propertyToCompare]: JSON.stringify(orderedValue), - }; - } - - return { - ...flatEntityAccumulator, - [propertyToCompare]: currentValue, - }; - }, - {} as Pick, - ); -} diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__tests__/__snapshots__/morph-relation-from-create-field-input-to-flat-field-metadatas-to-create.spec.ts.snap b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__tests__/__snapshots__/morph-relation-from-create-field-input-to-flat-field-metadatas-to-create.spec.ts.snap index e0e3e48ca8..0ba088aba1 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__tests__/__snapshots__/morph-relation-from-create-field-input-to-flat-field-metadatas-to-create.spec.ts.snap +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__tests__/__snapshots__/morph-relation-from-create-field-input-to-flat-field-metadatas-to-create.spec.ts.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test suite Failure cases should fail when morphRelationsCreationPayload has different relation types 1`] = ` { @@ -116,15 +116,12 @@ exports[`fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test su "result": { "flatFieldMetadatas": [ { - "applicationId": Any, "applicationUniversalIdentifier": Any, - "calendarViewIds": [], "calendarViewUniversalIdentifiers": [], "createdAt": Any, "defaultValue": null, "description": "new field description", "icon": "IconRelationOneToMany", - "id": Any, "isActive": true, "isCustom": true, "isLabelSyncedWithName": false, @@ -132,23 +129,15 @@ exports[`fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test su "isSystem": false, "isUIReadOnly": false, "isUnique": false, - "kanbanAggregateOperationViewIds": [], "kanbanAggregateOperationViewUniversalIdentifiers": [], "label": "newFieldLabel", - "mainGroupByFieldMetadataViewIds": [], "mainGroupByFieldMetadataViewUniversalIdentifiers": [], "morphId": Any, "name": "newFieldPets", - "objectMetadataId": Any, "objectMetadataUniversalIdentifier": Any, "options": null, - "relationTargetFieldMetadataId": Any, "relationTargetFieldMetadataUniversalIdentifier": Any, - "relationTargetObjectMetadataId": Any, "relationTargetObjectMetadataUniversalIdentifier": Any, - "settings": { - "relationType": "ONE_TO_MANY", - }, "standardOverrides": null, "type": "MORPH_RELATION", "universalIdentifier": Any, @@ -156,22 +145,16 @@ exports[`fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test su "relationType": "ONE_TO_MANY", }, "updatedAt": Any, - "viewFieldIds": [], "viewFieldUniversalIdentifiers": [], - "viewFilterIds": [], "viewFilterUniversalIdentifiers": [], - "workspaceId": Any, }, { - "applicationId": Any, "applicationUniversalIdentifier": Any, - "calendarViewIds": [], "calendarViewUniversalIdentifiers": [], "createdAt": Any, "defaultValue": null, "description": "new field description", "icon": "IconPet", - "id": Any, "isActive": true, "isCustom": true, "isLabelSyncedWithName": false, @@ -179,25 +162,15 @@ exports[`fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test su "isSystem": false, "isUIReadOnly": false, "isUnique": false, - "kanbanAggregateOperationViewIds": [], "kanbanAggregateOperationViewUniversalIdentifiers": [], "label": "Pet", - "mainGroupByFieldMetadataViewIds": [], "mainGroupByFieldMetadataViewUniversalIdentifiers": [], "morphId": null, "name": "pet", - "objectMetadataId": Any, "objectMetadataUniversalIdentifier": Any, "options": null, - "relationTargetFieldMetadataId": Any, "relationTargetFieldMetadataUniversalIdentifier": Any, - "relationTargetObjectMetadataId": Any, "relationTargetObjectMetadataUniversalIdentifier": Any, - "settings": { - "joinColumnName": "petId", - "onDelete": "SET_NULL", - "relationType": "MANY_TO_ONE", - }, "standardOverrides": null, "type": "RELATION", "universalIdentifier": Any, @@ -207,22 +180,16 @@ exports[`fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test su "relationType": "MANY_TO_ONE", }, "updatedAt": Any, - "viewFieldIds": [], "viewFieldUniversalIdentifiers": [], - "viewFilterIds": [], "viewFilterUniversalIdentifiers": [], - "workspaceId": Any, }, { - "applicationId": Any, "applicationUniversalIdentifier": Any, - "calendarViewIds": [], "calendarViewUniversalIdentifiers": [], "createdAt": Any, "defaultValue": null, "description": "new field description", "icon": "IconRelationOneToMany", - "id": Any, "isActive": true, "isCustom": true, "isLabelSyncedWithName": false, @@ -230,23 +197,15 @@ exports[`fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test su "isSystem": false, "isUIReadOnly": false, "isUnique": false, - "kanbanAggregateOperationViewIds": [], "kanbanAggregateOperationViewUniversalIdentifiers": [], "label": "newFieldLabel", - "mainGroupByFieldMetadataViewIds": [], "mainGroupByFieldMetadataViewUniversalIdentifiers": [], "morphId": Any, "name": "newFieldCompanies", - "objectMetadataId": Any, "objectMetadataUniversalIdentifier": Any, "options": null, - "relationTargetFieldMetadataId": Any, "relationTargetFieldMetadataUniversalIdentifier": Any, - "relationTargetObjectMetadataId": Any, "relationTargetObjectMetadataUniversalIdentifier": Any, - "settings": { - "relationType": "ONE_TO_MANY", - }, "standardOverrides": null, "type": "MORPH_RELATION", "universalIdentifier": Any, @@ -254,22 +213,16 @@ exports[`fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test su "relationType": "ONE_TO_MANY", }, "updatedAt": Any, - "viewFieldIds": [], "viewFieldUniversalIdentifiers": [], - "viewFilterIds": [], "viewFilterUniversalIdentifiers": [], - "workspaceId": Any, }, { - "applicationId": Any, "applicationUniversalIdentifier": Any, - "calendarViewIds": [], "calendarViewUniversalIdentifiers": [], "createdAt": Any, "defaultValue": null, "description": "new field description", "icon": "IconBuilding", - "id": Any, "isActive": true, "isCustom": true, "isLabelSyncedWithName": false, @@ -277,25 +230,15 @@ exports[`fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test su "isSystem": false, "isUIReadOnly": false, "isUnique": false, - "kanbanAggregateOperationViewIds": [], "kanbanAggregateOperationViewUniversalIdentifiers": [], "label": "Company", - "mainGroupByFieldMetadataViewIds": [], "mainGroupByFieldMetadataViewUniversalIdentifiers": [], "morphId": null, "name": "company", - "objectMetadataId": Any, "objectMetadataUniversalIdentifier": Any, "options": null, - "relationTargetFieldMetadataId": Any, "relationTargetFieldMetadataUniversalIdentifier": Any, - "relationTargetObjectMetadataId": Any, "relationTargetObjectMetadataUniversalIdentifier": Any, - "settings": { - "joinColumnName": "companyId", - "onDelete": "SET_NULL", - "relationType": "MANY_TO_ONE", - }, "standardOverrides": null, "type": "RELATION", "universalIdentifier": Any, @@ -305,65 +248,52 @@ exports[`fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test su "relationType": "MANY_TO_ONE", }, "updatedAt": Any, - "viewFieldIds": [], "viewFieldUniversalIdentifiers": [], - "viewFilterIds": [], "viewFilterUniversalIdentifiers": [], - "workspaceId": Any, }, ], "indexMetadatas": [ { - "applicationId": Any, "applicationUniversalIdentifier": Any, "createdAt": Any, - "flatIndexFieldMetadatas": [ - { - "createdAt": Any, - "fieldMetadataId": Any, - "id": Any, - "indexMetadataId": Any, - "order": 0, - "updatedAt": Any, - }, - ], - "id": Any, "indexType": "BTREE", "indexWhereClause": null, "isCustom": true, "isUnique": false, "name": "IDX_f687e4e4252800dddd8e5518362", - "objectMetadataId": Any, "objectMetadataUniversalIdentifier": Any, - "universalIdentifier": Any, - "updatedAt": Any, - "workspaceId": Any, - }, - { - "applicationId": Any, - "applicationUniversalIdentifier": Any, - "createdAt": Any, - "flatIndexFieldMetadatas": [ + "universalFlatIndexFieldMetadatas": [ { "createdAt": Any, - "fieldMetadataId": Any, - "id": Any, - "indexMetadataId": Any, + "fieldMetadataUniversalIdentifier": Any, + "indexMetadataUniversalIdentifier": Any, "order": 0, "updatedAt": Any, }, ], - "id": Any, + "universalIdentifier": Any, + "updatedAt": Any, + }, + { + "applicationUniversalIdentifier": Any, + "createdAt": Any, "indexType": "BTREE", "indexWhereClause": null, "isCustom": true, "isUnique": false, "name": "IDX_cb15d901e889e25d0a9acecb595", - "objectMetadataId": Any, "objectMetadataUniversalIdentifier": Any, + "universalFlatIndexFieldMetadatas": [ + { + "createdAt": Any, + "fieldMetadataUniversalIdentifier": Any, + "indexMetadataUniversalIdentifier": Any, + "order": 0, + "updatedAt": Any, + }, + ], "universalIdentifier": Any, "updatedAt": Any, - "workspaceId": Any, }, ], }, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__tests__/morph-relation-from-create-field-input-to-flat-field-metadatas-to-create.spec.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__tests__/morph-relation-from-create-field-input-to-flat-field-metadatas-to-create.spec.ts index d75e575c30..c61aa5cfe8 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__tests__/morph-relation-from-create-field-input-to-flat-field-metadatas-to-create.spec.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__tests__/morph-relation-from-create-field-input-to-flat-field-metadatas-to-create.spec.ts @@ -22,9 +22,9 @@ import { ROCKET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object const MOCK_FLAT_APPLICATION: FlatApplication = { id: '20202020-81ee-42da-a281-668632f32fe7', universalIdentifier: '20202020-81ee-42da-a281-668632f32fe7', - workspaceId: 'mock-workspace-id', name: 'Workspace Custom Application', description: null, + workspaceId: 'workspace-id', version: null, sourceType: 'local', sourcePath: '', @@ -62,8 +62,6 @@ type TestCase = EachTestingContext<{ }>; describe('fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test suite', () => { - const mockWorkspaceId = 'mock-workspace-id'; - describe('Success cases', () => { const successTestCases: TestCase[] = [ { @@ -93,7 +91,6 @@ describe('fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test s }, ], }, - workspaceId: mockWorkspaceId, flatObjectMetadataMaps, flatFieldMetadataMaps: emptyFlatFieldMetadataMaps, }, @@ -140,7 +137,6 @@ describe('fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test s objectMetadataId: ROCKET_FLAT_OBJECT_MOCK.id, morphRelationsCreationPayload: undefined as any, }, - workspaceId: mockWorkspaceId, flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, flatFieldMetadataMaps: emptyFlatFieldMetadataMaps, }, @@ -160,7 +156,6 @@ describe('fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test s objectMetadataId: ROCKET_FLAT_OBJECT_MOCK.id, morphRelationsCreationPayload: [], }, - workspaceId: mockWorkspaceId, flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, flatFieldMetadataMaps: emptyFlatFieldMetadataMaps, }, @@ -194,7 +189,6 @@ describe('fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test s }, ], }, - workspaceId: mockWorkspaceId, flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, flatFieldMetadataMaps: emptyFlatFieldMetadataMaps, }, @@ -228,7 +222,6 @@ describe('fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test s }, ], }, - workspaceId: mockWorkspaceId, flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, flatFieldMetadataMaps: emptyFlatFieldMetadataMaps, }, @@ -255,7 +248,6 @@ describe('fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test s } as any, ], }, - workspaceId: mockWorkspaceId, flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, flatFieldMetadataMaps: emptyFlatFieldMetadataMaps, }, @@ -282,7 +274,6 @@ describe('fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test s }, ], }, - workspaceId: mockWorkspaceId, flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, flatFieldMetadataMaps: emptyFlatFieldMetadataMaps, }, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-editable-properties.constant.ts index 9aa9d9786b..5a277421fe 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-editable-properties.constant.ts @@ -1,4 +1,4 @@ -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_FIELD_METADATA_EDITABLE_PROPERTIES = { custom: [ @@ -23,4 +23,7 @@ export const FLAT_FIELD_METADATA_EDITABLE_PROPERTIES = { 'settings', 'isUnique', ], -} as const satisfies Record<'standard' | 'custom', (keyof FlatFieldMetadata)[]>; +} as const satisfies Record< + 'standard' | 'custom', + MetadataEntityPropertyName<'fieldMetadata'>[] +>; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-morph-relation-editable-properties-on-sibling-morph-relation-update.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-morph-relation-editable-properties-on-sibling-morph-relation-update.constant.ts index af0bf1aebc..5d012b2a51 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-morph-relation-editable-properties-on-sibling-morph-relation-update.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-morph-relation-editable-properties-on-sibling-morph-relation-update.constant.ts @@ -1,4 +1,4 @@ -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_FIELD_METADATA_MORPH_RELATION_EDITABLE_PROPERTIES_ON_SIBLING_MORPH_RELATION_UPDATE_CONSTANT = { @@ -22,5 +22,5 @@ export const FLAT_FIELD_METADATA_MORPH_RELATION_EDITABLE_PROPERTIES_ON_SIBLING_M ], } as const satisfies Record< 'standard' | 'custom', - (keyof FlatFieldMetadata)[] + MetadataEntityPropertyName<'fieldMetadata'>[] >; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-relation-editable-properties-on-sibling-morph-or-relation-update.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-relation-editable-properties-on-sibling-morph-or-relation-update.constant.ts index 27a9ee11b5..49dac7bd45 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-relation-editable-properties-on-sibling-morph-or-relation-update.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-relation-editable-properties-on-sibling-morph-or-relation-update.constant.ts @@ -1,4 +1,4 @@ -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_FIELD_METADATA_RELATION_EDITABLE_PROPERTIES_ON_SIBLING_MORPH_OR_RELATION_UPDATE_CONSTANT = - ['isActive'] as const satisfies (keyof FlatFieldMetadata)[]; + ['isActive'] as const satisfies MetadataEntityPropertyName<'fieldMetadata'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-relation-properties-to-compare.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-relation-properties-to-compare.constant.ts index c5158c7c1c..5ce354f7bc 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-relation-properties-to-compare.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-relation-properties-to-compare.constant.ts @@ -1,4 +1,4 @@ -import { type ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY } from 'src/engine/metadata-modules/flat-entity/constant/all-flat-entity-properties-to-compare-and-stringify.constant'; +import { type ALL_UNIVERSAL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY } from 'src/engine/metadata-modules/flat-entity/constant/all-universal-flat-entity-properties-to-compare-and-stringify.constant'; export const FLAT_FIELD_METADATA_RELATION_PROPERTIES_TO_COMPARE = [ 'label', @@ -7,5 +7,5 @@ export const FLAT_FIELD_METADATA_RELATION_PROPERTIES_TO_COMPARE = [ 'standardOverrides', 'icon', 'name', - 'settings', -] as const satisfies (typeof ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY.fieldMetadata.propertiesToCompare)[number][]; + 'universalSettings', // TODO prastoin VERY IMPORTANT +] as const satisfies (typeof ALL_UNIVERSAL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY.fieldMetadata.propertiesToCompare)[number][]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-type-validator.service.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-type-validator.service.ts index d24109bc62..46f05d4b25 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-type-validator.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-type-validator.service.ts @@ -5,29 +5,25 @@ import { isDefined } from 'class-validator'; import { FieldMetadataType } from 'twenty-shared/types'; import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; -import { FlatEntityUpdate } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type'; -import { type FlatFieldMetadataTypeValidator } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-type-validator.type'; +import { + FlatFieldMetadataTypeValidationArgs, + type FlatFieldMetadataTypeValidator, +} from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-type-validator.type'; import { FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type'; import { validateEnumSelectFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-enum-flat-field-metadata.util'; import { validateFilesFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-files-flat-field-metadata.util'; import { validateMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-or-relation-flat-field-metadata.util'; import { validateMorphRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-relation-flat-field-metadata.util'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; const DEFAULT_NO_VALIDATION = (): FlatFieldMetadataValidationError[] => []; -export type GenericValidateFlatFieldMetadataTypeSpecificitiesArgs = - FlatEntityValidationArgs<'fieldMetadata'> & { - update?: FlatEntityUpdate<'fieldMetadata'>; - }; - const rejectUserCreation = ( fieldType: FieldMetadataType, message: string, userFriendlyMessage: ReturnType, ) => { return ( - args: GenericValidateFlatFieldMetadataTypeSpecificitiesArgs, + args: FlatFieldMetadataTypeValidationArgs, ): FlatFieldMetadataValidationError[] => { const isCreation = !isDefined(args.update); const isCustomField = args.flatEntityToValidate.isCustom; @@ -94,7 +90,7 @@ export class FlatFieldMetadataTypeValidatorService { }; public validateFlatFieldMetadataTypeSpecificities( - args: GenericValidateFlatFieldMetadataTypeSpecificitiesArgs, + args: FlatFieldMetadataTypeValidationArgs, ): FlatFieldMetadataValidationError[] { const { flatEntityToValidate } = args; const fieldType = flatEntityToValidate.type; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-type-validator.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-type-validator.type.ts index dc0ef53a71..b5b9e760f1 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-type-validator.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-type-validator.type.ts @@ -1,15 +1,18 @@ import { type FieldMetadataType } from 'twenty-shared/types'; -import { type GenericValidateFlatFieldMetadataTypeSpecificitiesArgs } from 'src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-type-validator.service'; import { type FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { type UniversalFlatEntityUpdate } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-update.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; export type FlatFieldMetadataTypeValidationArgs = Omit< - GenericValidateFlatFieldMetadataTypeSpecificitiesArgs, + UniversalFlatEntityValidationArgs<'fieldMetadata'> & { + update?: UniversalFlatEntityUpdate<'fieldMetadata'>; + }, 'flatEntityToValidate' > & { - flatEntityToValidate: FlatFieldMetadata; + flatEntityToValidate: UniversalFlatFieldMetadata; }; export type FlatFieldMetadataTypeValidator = { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/__tests__/generate-morph-or-relation-flat-field-metadata-pair.spec.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/__tests__/generate-morph-or-relation-flat-field-metadata-pair.spec.ts index a9f1aa4dde..2d79c2ef03 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/__tests__/generate-morph-or-relation-flat-field-metadata-pair.spec.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/__tests__/generate-morph-or-relation-flat-field-metadata-pair.spec.ts @@ -17,10 +17,10 @@ import { PET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-me const MOCK_FLAT_APPLICATION: FlatApplication = { id: '20202020-81ee-42da-a281-668632f32fe7', universalIdentifier: '20202020-81ee-42da-a281-668632f32fe7', - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', name: 'Workspace Custom Application', description: null, version: null, + workspaceId: 'workspace-id', sourceType: 'local', sourcePath: '', packageJsonChecksum: null, @@ -51,8 +51,6 @@ type TestCase = EachTestingContext<{ }>; describe('generate Morph Or Relation Flat Field Metadata Pair test suite', () => { - const mockWorkspaceId = '20202020-1c25-4d02-bf25-6aeccf7ea419'; - describe('Success cases', () => { const testCases: TestCase[] = [ { @@ -64,7 +62,6 @@ describe('generate Morph Or Relation Flat Field Metadata Pair test suite', () => targetFlatObjectMetadata: PET_FLAT_OBJECT_MOCK, targetFlatFieldMetadataType: FieldMetadataType.RELATION, sourceFlatObjectMetadataJoinColumnName: 'petId', - workspaceId: mockWorkspaceId, flatApplication: MOCK_FLAT_APPLICATION, createFieldInput: { name: 'pets', @@ -72,13 +69,13 @@ describe('generate Morph Or Relation Flat Field Metadata Pair test suite', () => description: 'Company pets', icon: 'IconCat', type: FieldMetadataType.RELATION, - objectMetadataId: COMPANY_FLAT_OBJECT_MOCK.id, isCustom: true, isSystem: false, isUnique: false, relationCreationPayload: { type: RelationType.ONE_TO_MANY, - targetObjectMetadataId: PET_FLAT_OBJECT_MOCK.id, + targetObjectMetadataId: + PET_FLAT_OBJECT_MOCK.universalIdentifier, targetFieldLabel: 'Company', targetFieldIcon: 'IconBuildingSkyscraper', }, @@ -100,7 +97,6 @@ describe('generate Morph Or Relation Flat Field Metadata Pair test suite', () => targetFlatObjectMetadata: PET_FLAT_OBJECT_MOCK, targetFlatFieldMetadataType: FieldMetadataType.RELATION, sourceFlatObjectMetadataJoinColumnName: 'petId', - workspaceId: mockWorkspaceId, flatApplication: MOCK_FLAT_APPLICATION, createFieldInput: { name: 'pets', @@ -108,13 +104,13 @@ describe('generate Morph Or Relation Flat Field Metadata Pair test suite', () => description: 'Company pets', icon: 'IconCat', type: FieldMetadataType.RELATION, - objectMetadataId: COMPANY_FLAT_OBJECT_MOCK.id, isCustom: true, isSystem: false, isUnique: false, relationCreationPayload: { type: RelationType.MANY_TO_ONE, - targetObjectMetadataId: PET_FLAT_OBJECT_MOCK.id, + targetObjectMetadataId: + PET_FLAT_OBJECT_MOCK.universalIdentifier, targetFieldLabel: 'Company', targetFieldIcon: 'IconBuildingSkyscraper', }, @@ -136,7 +132,6 @@ describe('generate Morph Or Relation Flat Field Metadata Pair test suite', () => targetFlatObjectMetadata: PET_FLAT_OBJECT_MOCK, targetFlatFieldMetadataType: FieldMetadataType.RELATION, sourceFlatObjectMetadataJoinColumnName: 'petId', - workspaceId: mockWorkspaceId, flatApplication: MOCK_FLAT_APPLICATION, createFieldInput: { name: 'pets', @@ -144,13 +139,13 @@ describe('generate Morph Or Relation Flat Field Metadata Pair test suite', () => description: 'Company pets', icon: 'IconCat', type: FieldMetadataType.RELATION, - objectMetadataId: COMPANY_FLAT_OBJECT_MOCK.id, isCustom: false, isSystem: true, isUnique: true, relationCreationPayload: { type: RelationType.MANY_TO_ONE, - targetObjectMetadataId: PET_FLAT_OBJECT_MOCK.id, + targetObjectMetadataId: + PET_FLAT_OBJECT_MOCK.universalIdentifier, targetFieldLabel: 'Company', targetFieldIcon: 'IconBuildingSkyscraper', }, @@ -172,7 +167,6 @@ describe('generate Morph Or Relation Flat Field Metadata Pair test suite', () => targetFlatObjectMetadata: PET_FLAT_OBJECT_MOCK, targetFlatFieldMetadataType: FieldMetadataType.RELATION, sourceFlatObjectMetadataJoinColumnName: 'targetPetId', - workspaceId: mockWorkspaceId, flatApplication: MOCK_FLAT_APPLICATION, morphId: '20202020-9a2b-4c3d-a4e5-f6a7b8c9d0e1', createFieldInput: { @@ -181,13 +175,13 @@ describe('generate Morph Or Relation Flat Field Metadata Pair test suite', () => description: 'Morph relation to pet', icon: 'IconCat', type: FieldMetadataType.MORPH_RELATION, - objectMetadataId: COMPANY_FLAT_OBJECT_MOCK.id, isCustom: false, isSystem: true, isUnique: false, relationCreationPayload: { type: RelationType.MANY_TO_ONE, - targetObjectMetadataId: PET_FLAT_OBJECT_MOCK.id, + targetObjectMetadataId: + PET_FLAT_OBJECT_MOCK.universalIdentifier, targetFieldLabel: 'Companies', targetFieldIcon: 'IconBuildingSkyscraper', }, @@ -209,7 +203,6 @@ describe('generate Morph Or Relation Flat Field Metadata Pair test suite', () => targetFlatObjectMetadata: PET_FLAT_OBJECT_MOCK, targetFlatFieldMetadataType: FieldMetadataType.RELATION, sourceFlatObjectMetadataJoinColumnName: 'targetPetId', - workspaceId: mockWorkspaceId, flatApplication: MOCK_FLAT_APPLICATION, morphId: '20202020-9a2b-4c3d-a4e5-f6a7b8c9d0e1', createFieldInput: { @@ -218,13 +211,13 @@ describe('generate Morph Or Relation Flat Field Metadata Pair test suite', () => description: 'Morph relation to pet', icon: 'IconCat', type: FieldMetadataType.MORPH_RELATION, - objectMetadataId: COMPANY_FLAT_OBJECT_MOCK.id, isCustom: false, isSystem: true, isUnique: false, relationCreationPayload: { type: RelationType.ONE_TO_MANY, - targetObjectMetadataId: PET_FLAT_OBJECT_MOCK.id, + targetObjectMetadataId: + PET_FLAT_OBJECT_MOCK.universalIdentifier, targetFieldLabel: 'Companies', targetFieldIcon: 'IconBuildingSkyscraper', }, @@ -246,7 +239,6 @@ describe('generate Morph Or Relation Flat Field Metadata Pair test suite', () => targetFlatObjectMetadata: PET_FLAT_OBJECT_MOCK, targetFlatFieldMetadataType: FieldMetadataType.MORPH_RELATION, sourceFlatObjectMetadataJoinColumnName: 'targetPetId', - workspaceId: mockWorkspaceId, flatApplication: MOCK_FLAT_APPLICATION, morphId: '20202020-9a2b-4c3d-a4e5-f6a7b8c9d0e1', createFieldInput: { @@ -255,13 +247,13 @@ describe('generate Morph Or Relation Flat Field Metadata Pair test suite', () => description: 'Morph relation to pet', icon: 'IconCat', type: FieldMetadataType.RELATION, - objectMetadataId: COMPANY_FLAT_OBJECT_MOCK.id, isCustom: false, isSystem: true, isUnique: false, relationCreationPayload: { type: RelationType.ONE_TO_MANY, - targetObjectMetadataId: PET_FLAT_OBJECT_MOCK.id, + targetObjectMetadataId: + PET_FLAT_OBJECT_MOCK.universalIdentifier, targetFieldLabel: 'Companies', targetFieldIcon: 'IconBuildingSkyscraper', }, @@ -300,16 +292,16 @@ describe('generate Morph Or Relation Flat Field Metadata Pair test suite', () => expect(sourceFieldMetadata.type).toBe(expectedSourceFieldType); expect(sourceFieldMetadata.name).toBe(input.createFieldInput.name); expect(sourceFieldMetadata.label).toBe(input.createFieldInput.label); - expect(sourceFieldMetadata.objectMetadataId).toBe( - input.sourceFlatObjectMetadata.id, - ); - expect(sourceFieldMetadata.relationTargetObjectMetadataId).toBe( - input.targetFlatObjectMetadata.id, + expect(sourceFieldMetadata.objectMetadataUniversalIdentifier).toBe( + input.sourceFlatObjectMetadata.universalIdentifier, ); + expect( + sourceFieldMetadata.relationTargetObjectMetadataUniversalIdentifier, + ).toBe(input.targetFlatObjectMetadata.universalIdentifier); const sourceSettings = - sourceFieldMetadata.settings as FieldMetadataSettingsMapping['RELATION']; + sourceFieldMetadata.universalSettings as FieldMetadataSettingsMapping['RELATION']; const targetSettings = - targetFieldMetadata.settings as FieldMetadataSettingsMapping['RELATION']; + targetFieldMetadata.universalSettings as FieldMetadataSettingsMapping['RELATION']; expect(sourceSettings.relationType).toBe(expectedSourceRelationType); @@ -320,20 +312,20 @@ describe('generate Morph Or Relation Flat Field Metadata Pair test suite', () => } expect(targetFieldMetadata.type).toBe(expectedTargetFieldType); - expect(targetFieldMetadata.objectMetadataId).toBe( - input.targetFlatObjectMetadata.id, - ); - expect(targetFieldMetadata.relationTargetObjectMetadataId).toBe( - input.sourceFlatObjectMetadata.id, + expect(targetFieldMetadata.objectMetadataUniversalIdentifier).toBe( + input.targetFlatObjectMetadata.universalIdentifier, ); + expect( + targetFieldMetadata.relationTargetObjectMetadataUniversalIdentifier, + ).toBe(input.sourceFlatObjectMetadata.universalIdentifier); expect(targetSettings.relationType).toBe(expectedTargetRelationType); - expect(sourceFieldMetadata.relationTargetFieldMetadataId).toBe( - targetFieldMetadata.id, - ); - expect(targetFieldMetadata.relationTargetFieldMetadataId).toBe( - sourceFieldMetadata.id, - ); + expect( + sourceFieldMetadata.relationTargetFieldMetadataUniversalIdentifier, + ).toBe(targetFieldMetadata.universalIdentifier); + expect( + targetFieldMetadata.relationTargetFieldMetadataUniversalIdentifier, + ).toBe(sourceFieldMetadata.universalIdentifier); if (expectedSourceRelationType === RelationType.MANY_TO_ONE) { expect(sourceSettings.joinColumnName).toBe( @@ -359,7 +351,6 @@ describe('generate Morph Or Relation Flat Field Metadata Pair test suite', () => targetFlatObjectMetadata: PET_FLAT_OBJECT_MOCK, targetFlatFieldMetadataType: FieldMetadataType.RELATION, sourceFlatObjectMetadataJoinColumnName: 'petId', - workspaceId: mockWorkspaceId, flatApplication: MOCK_FLAT_APPLICATION, createFieldInput: { name: 'pets', @@ -367,7 +358,6 @@ describe('generate Morph Or Relation Flat Field Metadata Pair test suite', () => description: 'Company pets', icon: 'IconCat', type: FieldMetadataType.RELATION, - objectMetadataId: COMPANY_FLAT_OBJECT_MOCK.id, isCustom: true, isSystem: false, isUnique: false, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-to-update-and-related-flat-field-to-update.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-to-update-and-related-flat-field-to-update.util.ts index e13ad55aa5..e135e760f1 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-to-update-and-related-flat-field-to-update.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-to-update-and-related-flat-field-to-update.util.ts @@ -1,7 +1,14 @@ import { FieldMetadataType, type FromTo } from 'twenty-shared/types'; +import { isDefined } from 'twenty-shared/utils'; import { type UpdateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/update-field.input'; +import { isFieldMetadataSettingsOfType } from 'src/engine/metadata-modules/field-metadata/utils/is-field-metadata-settings-of-type.util'; +import { + FlatEntityMapsException, + FlatEntityMapsExceptionCode, +} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; +import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { FLAT_FIELD_METADATA_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-editable-properties.constant'; import { FLAT_FIELD_METADATA_MORPH_RELATION_EDITABLE_PROPERTIES_ON_SIBLING_MORPH_RELATION_UPDATE_CONSTANT } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-morph-relation-editable-properties-on-sibling-morph-relation-update.constant'; import { FLAT_FIELD_METADATA_RELATION_EDITABLE_PROPERTIES_ON_SIBLING_MORPH_OR_RELATION_UPDATE_CONSTANT } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-relation-editable-properties-on-sibling-morph-or-relation-update.constant'; @@ -58,6 +65,45 @@ export const computeFlatFieldToUpdateAndRelatedFlatFieldToUpdate = ({ standardOverrides, }; + if (updatedEditableFieldProperties.settings !== undefined) { + const updatedSettings = toFlatFieldMetadata.settings; + + const isRelationSettings = + isFieldMetadataSettingsOfType( + updatedSettings, + FieldMetadataType.RELATION, + ) || + isFieldMetadataSettingsOfType( + updatedSettings, + FieldMetadataType.MORPH_RELATION, + ); + + if ( + isRelationSettings && + isDefined(updatedSettings?.junctionTargetFieldId) + ) { + const junctionFlatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({ + flatEntityId: updatedSettings.junctionTargetFieldId, + flatEntityMaps: flatFieldMetadataMaps, + }); + + if (!isDefined(junctionFlatFieldMetadata)) { + throw new FlatEntityMapsException( + `Field metadata universal identifier not found for id: ${updatedSettings.junctionTargetFieldId}`, + FlatEntityMapsExceptionCode.RELATION_UNIVERSAL_IDENTIFIER_NOT_FOUND, + ); + } + + toFlatFieldMetadata.universalSettings = { + ...updatedSettings, + junctionTargetFieldUniversalIdentifier: + junctionFlatFieldMetadata.universalIdentifier, + }; + } else { + toFlatFieldMetadata.universalSettings = updatedSettings; + } + } + if ( isFlatFieldMetadataOfType(fromFlatFieldMetadata, FieldMetadataType.RELATION) ) { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-to-update-from-morph-relation-update-payload.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-to-update-from-morph-relation-update-payload.util.ts index b46754b10b..32884db8ff 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-to-update-from-morph-relation-update-payload.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-to-update-from-morph-relation-update-payload.util.ts @@ -7,14 +7,15 @@ import { computeMorphRelationFieldName, isDefined } from 'twenty-shared/utils'; import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { computeMorphOrRelationFieldJoinColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-morph-or-relation-field-join-column-name.util'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { extractJunctionTargetSettingsFromSettings } from 'src/engine/metadata-modules/flat-field-metadata/utils/extract-junction-target-settings-from-settings.util'; import { generateMorphOrRelationFlatFieldMetadataPair } from 'src/engine/metadata-modules/flat-field-metadata/utils/generate-morph-or-relation-flat-field-metadata-pair.util'; -import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { getMorphNameFromMorphFieldMetadataName } from 'src/engine/metadata-modules/flat-object-metadata/utils/get-morph-name-from-morph-field-metadata-name.util'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; type ComputeFlatFieldToUpdateFromMorphRelationUpdatePayloadArgs = { flatApplication: FlatApplication; @@ -31,11 +32,11 @@ export const computeFlatFieldToUpdateFromMorphRelationUpdatePayload = ({ fieldMetadataToUpdate, flatObjectMetadataMaps, }: ComputeFlatFieldToUpdateFromMorphRelationUpdatePayloadArgs): { - flatFieldMetadatasToCreate: FlatFieldMetadata[]; - flatIndexMetadatasToCreate: FlatIndexMetadata[]; + flatFieldMetadatasToCreate: UniversalFlatFieldMetadata[]; + flatIndexMetadatasToCreate: UniversalFlatIndexMetadata[]; } => { - const flatFieldMetadatasToCreate: FlatFieldMetadata[] = []; - const flatIndexMetadatasToCreate: FlatIndexMetadata[] = []; + const flatFieldMetadatasToCreate: UniversalFlatFieldMetadata[] = []; + const flatIndexMetadatasToCreate: UniversalFlatIndexMetadata[] = []; if (!isDefined(morphRelationsUpdatePayload)) { return { flatFieldMetadatasToCreate, flatIndexMetadatasToCreate }; @@ -57,7 +58,7 @@ export const computeFlatFieldToUpdateFromMorphRelationUpdatePayload = ({ const morphNameWithoutObjectName = getMorphNameFromMorphFieldMetadataName({ morphRelationFlatFieldMetadata: { name: fieldMetadataToUpdate.name, - settings: fieldMetadataToUpdate.settings, + universalSettings: fieldMetadataToUpdate.universalSettings, }, nameSingular: initialFlatFieldMetadataTargetObjectMetadata.nameSingular, namePlural: initialFlatFieldMetadataTargetObjectMetadata.namePlural, @@ -69,7 +70,6 @@ export const computeFlatFieldToUpdateFromMorphRelationUpdatePayload = ({ }); const commonTargetFieldLabel = initialTargetFieldMetadata.label; const commonTargetFieldName = initialTargetFieldMetadata.name; - const commonObjectMetadataId = initialTargetFieldMetadata.objectMetadataId; const { junctionTargetFieldId } = extractJunctionTargetSettingsFromSettings( fieldMetadataToUpdate.settings, @@ -102,7 +102,6 @@ export const computeFlatFieldToUpdateFromMorphRelationUpdatePayload = ({ type: FieldMetadataType.MORPH_RELATION, name: computedMorphName, label: morphRelationsCommonLabel, - objectMetadataId: commonObjectMetadataId, relationCreationPayload: { type: fieldMetadataToUpdate.settings.relationType, targetObjectMetadataId, @@ -113,7 +112,6 @@ export const computeFlatFieldToUpdateFromMorphRelationUpdatePayload = ({ sourceFlatObjectMetadata: sourceObjectMetadata, targetFlatObjectMetadata: newTargetObjectMetadata, targetFlatFieldMetadataType: FieldMetadataType.RELATION, - workspaceId: fieldMetadataToUpdate.workspaceId, flatApplication, sourceFlatObjectMetadataJoinColumnName: computeMorphOrRelationFieldJoinColumnName({ diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadatas-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadatas-to-create.util.ts index 864a13c2be..1259734393 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadatas-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadatas-to-create.util.ts @@ -17,29 +17,27 @@ import { generateRatingOptions } from 'src/engine/metadata-modules/field-metadat import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { type FieldInputTranspilationResult } from 'src/engine/metadata-modules/flat-field-metadata/types/field-input-transpilation-result.type'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { fromMorphRelationCreateFieldInputToFlatFieldMetadatas } from 'src/engine/metadata-modules/flat-field-metadata/utils/from-morph-relation-create-field-input-to-flat-field-metadatas.util'; import { fromRelationCreateFieldInputToFlatFieldMetadatas } from 'src/engine/metadata-modules/flat-field-metadata/utils/from-relation-create-field-input-to-flat-field-metadatas.util'; import { generateIndexForFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/generate-index-for-flat-field-metadata.util'; import { getDefaultFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util'; -import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; export type FromCreateFieldInputToFlatObjectMetadataArgs = { createFieldInput: Omit; - workspaceId: string; flatApplication: FlatApplication; } & Pick; export const fromCreateFieldInputToFlatFieldMetadatasToCreate = async ({ createFieldInput: rawCreateFieldInput, - workspaceId, flatObjectMetadataMaps: existingFlatObjectMetadataMaps, flatFieldMetadataMaps: existingFlatFieldMetadataMaps, flatApplication, }: FromCreateFieldInputToFlatObjectMetadataArgs): Promise< FieldInputTranspilationResult<{ - flatFieldMetadatas: FlatFieldMetadata[]; - indexMetadatas: FlatIndexMetadata[]; + flatFieldMetadatas: UniversalFlatFieldMetadata[]; + indexMetadatas: UniversalFlatIndexMetadata[]; }> > => { if (rawCreateFieldInput.isRemoteCreation) { @@ -77,11 +75,8 @@ export const fromCreateFieldInputToFlatFieldMetadatasToCreate = async ({ }; } - const fieldMetadataId = v4(); const commonFlatFieldMetadata = getDefaultFlatFieldMetadata({ createFieldInput, - workspaceId, - fieldMetadataId, flatApplication, objectMetadataUniversalIdentifier: parentFlatObjectMetadata.universalIdentifier, @@ -97,7 +92,6 @@ export const fromCreateFieldInputToFlatFieldMetadatasToCreate = async ({ existingFlatObjectMetadataMaps, existingFlatFieldMetadataMaps, sourceFlatObjectMetadata: parentFlatObjectMetadata, - workspaceId, flatApplication, }); } @@ -110,7 +104,6 @@ export const fromCreateFieldInputToFlatFieldMetadatasToCreate = async ({ ...createFieldInput, type: createFieldInput.type, }, - workspaceId, flatApplication, }); } @@ -122,11 +115,12 @@ export const fromCreateFieldInputToFlatFieldMetadatasToCreate = async ({ { ...commonFlatFieldMetadata, type: createFieldInput.type, - settings: null, defaultValue: commonFlatFieldMetadata.defaultValue as string, // Could this be improved ? options: generateRatingOptions(), universalSettings: null, - } satisfies FlatFieldMetadata, + } satisfies UniversalFlatFieldMetadata< + typeof createFieldInput.type + >, ], indexMetadatas: [], }, @@ -153,9 +147,10 @@ export const fromCreateFieldInputToFlatFieldMetadatasToCreate = async ({ type: createFieldInput.type, options, defaultValue: commonFlatFieldMetadata.defaultValue as string, // Could this be improved ? - settings: null, universalSettings: null, - } satisfies FlatFieldMetadata, + } satisfies UniversalFlatFieldMetadata< + typeof createFieldInput.type + >, ], indexMetadatas: [], }, @@ -192,14 +187,13 @@ export const fromCreateFieldInputToFlatFieldMetadatasToCreate = async ({ case FieldMetadataType.RICH_TEXT_V2: case FieldMetadataType.ACTOR: case FieldMetadataType.ARRAY: { - const indexMetadatas: FlatIndexMetadata[] = []; + const indexMetadatas: UniversalFlatIndexMetadata[] = []; if (commonFlatFieldMetadata.isUnique) { indexMetadatas.push( generateIndexForFlatFieldMetadata({ flatFieldMetadata: commonFlatFieldMetadata, flatObjectMetadata: parentFlatObjectMetadata, - workspaceId, }), ); } diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-delete-field-input-to-flat-field-metadatas-to-delete.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-delete-field-input-to-flat-field-metadatas-to-delete.util.ts index 1279e42479..4ce4bbed6e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-delete-field-input-to-flat-field-metadatas-to-delete.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-delete-field-input-to-flat-field-metadatas-to-delete.util.ts @@ -9,13 +9,14 @@ import { FieldMetadataExceptionCode, } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; -import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; +import { findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-universal-identifier-in-universal-flat-entity-maps-or-throw.util'; import { computeFlatFieldMetadataRelatedFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-metadata-related-flat-field-metadata.util'; import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; import { generateFlatIndexMetadataWithNameOrThrow } from 'src/engine/metadata-modules/index-metadata/utils/generate-flat-index.util'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; type FromDeleteFieldInputToFlatFieldMetadatasToDeleteArgs = { deleteOneFieldInput: DeleteOneFieldInput; @@ -30,9 +31,9 @@ export const fromDeleteFieldInputToFlatFieldMetadatasToDelete = ({ flatIndexMaps: existingFlatIndexMaps, flatFieldMetadataMaps: existingFlatFieldMetadataMaps, }: FromDeleteFieldInputToFlatFieldMetadatasToDeleteArgs): { - flatFieldMetadatasToDelete: FlatFieldMetadata[]; - flatIndexesToUpdate: FlatIndexMetadata[]; - flatIndexesToDelete: FlatIndexMetadata[]; + flatFieldMetadatasToDelete: UniversalFlatFieldMetadata[]; + flatIndexesToUpdate: UniversalFlatIndexMetadata[]; + flatIndexesToDelete: UniversalFlatIndexMetadata[]; } => { const { id: fieldMetadataToDeleteId } = trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( @@ -125,8 +126,8 @@ export const fromDeleteFieldInputToFlatFieldMetadatasToDelete = ({ const { flatIndexesToDelete, flatIndexesToUpdate } = [ ...flatIndexMap.values(), ].reduce<{ - flatIndexesToUpdate: FlatIndexMetadata[]; - flatIndexesToDelete: FlatIndexMetadata[]; + flatIndexesToUpdate: UniversalFlatIndexMetadata[]; + flatIndexesToDelete: UniversalFlatIndexMetadata[]; }>( (acc, flatIndex) => { if (flatIndex.flatIndexFieldMetadatas.length === 0) { @@ -136,15 +137,17 @@ export const fromDeleteFieldInputToFlatFieldMetadatasToDelete = ({ }; } - const flatObjectMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({ + const flatObjectMetadata = findFlatEntityByUniversalIdentifierOrThrow({ flatEntityMaps: existingFlatObjectMetadataMaps, - flatEntityId: flatIndex.objectMetadataId, + universalIdentifier: flatIndex.objectMetadataUniversalIdentifier, }); const objectFlatFieldMetadatas = - findManyFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityMaps: existingFlatFieldMetadataMaps, - flatEntityIds: flatObjectMetadata.fieldIds, - }); + findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow( + { + flatEntityMaps: existingFlatFieldMetadataMaps, + universalIdentifiers: flatObjectMetadata.fieldUniversalIdentifiers, + }, + ); const newIndex = generateFlatIndexMetadataWithNameOrThrow({ flatObjectMetadata, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-morph-relation-create-field-input-to-flat-field-metadatas.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-morph-relation-create-field-input-to-flat-field-metadatas.util.ts index b9d3a5f100..d0650c5f09 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-morph-relation-create-field-input-to-flat-field-metadatas.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-morph-relation-create-field-input-to-flat-field-metadatas.util.ts @@ -14,8 +14,9 @@ import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-m import { extractJunctionTargetSettingsFromSettings } from 'src/engine/metadata-modules/flat-field-metadata/utils/extract-junction-target-settings-from-settings.util'; import { generateMorphOrRelationFlatFieldMetadataPair } from 'src/engine/metadata-modules/flat-field-metadata/utils/generate-morph-or-relation-flat-field-metadata-pair.util'; import { validateMorphRelationCreationPayload } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-relation-creation-payload.util'; -import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; type FromMorphRelationCreateFieldInputToFlatFieldMetadatasArgs = { createFieldInput: Omit & { @@ -24,7 +25,6 @@ type FromMorphRelationCreateFieldInputToFlatFieldMetadatasArgs = { existingFlatObjectMetadataMaps: FlatEntityMaps; existingFlatFieldMetadataMaps: FlatEntityMaps; sourceFlatObjectMetadata: FlatObjectMetadata; - workspaceId: string; flatApplication: FlatApplication; }; export const fromMorphRelationCreateFieldInputToFlatFieldMetadatas = async ({ @@ -32,12 +32,11 @@ export const fromMorphRelationCreateFieldInputToFlatFieldMetadatas = async ({ existingFlatObjectMetadataMaps, existingFlatFieldMetadataMaps, sourceFlatObjectMetadata, - workspaceId, flatApplication, }: FromMorphRelationCreateFieldInputToFlatFieldMetadatasArgs): Promise< FieldInputTranspilationResult<{ - flatFieldMetadatas: FlatFieldMetadata[]; - indexMetadatas: FlatIndexMetadata[]; + flatFieldMetadatas: UniversalFlatFieldMetadata[]; + indexMetadatas: UniversalFlatIndexMetadata[]; }> > => { const rawMorphCreationPayload = @@ -64,7 +63,8 @@ export const fromMorphRelationCreateFieldInputToFlatFieldMetadatas = async ({ await validateMorphRelationCreationPayload({ existingFlatObjectMetadataMaps, morphRelationCreationPayload: rawMorphCreationPayload, - objectMetadataId: sourceFlatObjectMetadata.id, + objectMetadataUniversalIdentifier: + sourceFlatObjectMetadata.universalIdentifier, }); if (morphRelationCreationPayloadValidation.status === 'fail') { @@ -108,7 +108,6 @@ export const fromMorphRelationCreateFieldInputToFlatFieldMetadatas = async ({ sourceFlatObjectMetadata, targetFlatObjectMetadata, targetFlatFieldMetadataType: FieldMetadataType.RELATION, - workspaceId, morphId, flatApplication, junctionTargetFlatFieldMetadata, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-relation-create-field-input-to-flat-field-metadatas.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-relation-create-field-input-to-flat-field-metadatas.util.ts index 910a7c1cbe..c544a86701 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-relation-create-field-input-to-flat-field-metadatas.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-relation-create-field-input-to-flat-field-metadatas.util.ts @@ -11,12 +11,11 @@ import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/ import { type FieldInputTranspilationResult } from 'src/engine/metadata-modules/flat-field-metadata/types/field-input-transpilation-result.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { extractJunctionTargetSettingsFromSettings } from 'src/engine/metadata-modules/flat-field-metadata/utils/extract-junction-target-settings-from-settings.util'; -import { - generateMorphOrRelationFlatFieldMetadataPair, - type SourceTargetMorphOrRelationFlatFieldAndFlatIndex, -} from 'src/engine/metadata-modules/flat-field-metadata/utils/generate-morph-or-relation-flat-field-metadata-pair.util'; +import { generateMorphOrRelationFlatFieldMetadataPair } from 'src/engine/metadata-modules/flat-field-metadata/utils/generate-morph-or-relation-flat-field-metadata-pair.util'; import { validateRelationCreationPayload } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-relation-creation-payload.util'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; type FromRelationCreateFieldInputToFlatFieldMetadataArgs = { createFieldInput: Omit & { @@ -25,7 +24,6 @@ type FromRelationCreateFieldInputToFlatFieldMetadataArgs = { existingFlatObjectMetadataMaps: FlatEntityMaps; existingFlatFieldMetadataMaps: FlatEntityMaps; sourceFlatObjectMetadata: FlatObjectMetadata; - workspaceId: string; flatApplication: FlatApplication; }; export const fromRelationCreateFieldInputToFlatFieldMetadatas = async ({ @@ -33,10 +31,12 @@ export const fromRelationCreateFieldInputToFlatFieldMetadatas = async ({ existingFlatFieldMetadataMaps, sourceFlatObjectMetadata, createFieldInput, - workspaceId, flatApplication, }: FromRelationCreateFieldInputToFlatFieldMetadataArgs): Promise< - FieldInputTranspilationResult + FieldInputTranspilationResult<{ + flatFieldMetadatas: UniversalFlatFieldMetadata[]; + indexMetadatas: UniversalFlatIndexMetadata[]; + }> > => { const rawCreationPayload = createFieldInput.relationCreationPayload; @@ -87,7 +87,6 @@ export const fromRelationCreateFieldInputToFlatFieldMetadatas = async ({ sourceFlatObjectMetadata, targetFlatObjectMetadata, targetFlatFieldMetadataType: FieldMetadataType.RELATION, - workspaceId, flatApplication, junctionTargetFlatFieldMetadata, }); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-update-field-input-to-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-update-field-input-to-flat-field-metadata.util.ts index 1aa935b88a..4e09d208ce 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-update-field-input-to-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-update-field-input-to-flat-field-metadata.util.ts @@ -12,7 +12,6 @@ import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/ import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { type FieldInputTranspilationResult } from 'src/engine/metadata-modules/flat-field-metadata/types/field-input-transpilation-result.type'; import { type FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { computeFlatFieldToUpdateAndRelatedFlatFieldToUpdate } from 'src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-to-update-and-related-flat-field-to-update.util'; import { computeFlatFieldToUpdateFromMorphRelationUpdatePayload } from 'src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-to-update-from-morph-relation-update-payload.util'; import { @@ -21,6 +20,7 @@ import { handleFlatFieldMetadataUpdateSideEffect, } from 'src/engine/metadata-modules/flat-field-metadata/utils/handle-flat-field-metadata-update-side-effect.util'; import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; type FromUpdateFieldInputToFlatFieldMetadataArgs = { updateFieldInput: UpdateFieldInput; @@ -38,8 +38,8 @@ type FromUpdateFieldInputToFlatFieldMetadataArgs = { >; type FlatFieldMetadataAndIndexToUpdate = { - flatFieldMetadatasToUpdate: FlatFieldMetadata[]; - flatFieldMetadatasToCreate: FlatFieldMetadata[]; + flatFieldMetadatasToUpdate: UniversalFlatFieldMetadata[]; + flatFieldMetadatasToCreate: UniversalFlatFieldMetadata[]; } & FlatFieldMetadataUpdateSideEffects; export const fromUpdateFieldInputToFlatFieldMetadata = ({ flatApplication, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/generate-index-for-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/generate-index-for-flat-field-metadata.util.ts index 19d1d8cb00..2371c08322 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/generate-index-for-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/generate-index-for-flat-field-metadata.util.ts @@ -1,58 +1,51 @@ import { v4 } from 'uuid'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { IndexType } from 'src/engine/metadata-modules/index-metadata/types/indexType.types'; import { generateFlatIndexMetadataWithNameOrThrow } from 'src/engine/metadata-modules/index-metadata/utils/generate-flat-index.util'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; type GenerateIndexForFlatFieldMetadataArgs = { - flatFieldMetadata: FlatFieldMetadata; - flatObjectMetadata: FlatObjectMetadata; - workspaceId: string; + flatFieldMetadata: UniversalFlatFieldMetadata; + flatObjectMetadata: UniversalFlatObjectMetadata; }; export const generateIndexForFlatFieldMetadata = ({ flatFieldMetadata, flatObjectMetadata, - workspaceId, -}: GenerateIndexForFlatFieldMetadataArgs): FlatIndexMetadata => { - const indexId = v4(); +}: GenerateIndexForFlatFieldMetadataArgs): UniversalFlatIndexMetadata => { + const indexMetadataUniversalIdentifier = v4(); const createdAt = new Date().toISOString(); - const flatIndex: FlatIndexMetadata = generateFlatIndexMetadataWithNameOrThrow( - { + const flatIndex: UniversalFlatIndexMetadata = + generateFlatIndexMetadataWithNameOrThrow({ objectFlatFieldMetadatas: [flatFieldMetadata], flatIndex: { createdAt, - flatIndexFieldMetadatas: [ + universalFlatIndexFieldMetadatas: [ { createdAt, - fieldMetadataId: flatFieldMetadata.id, - id: v4(), - indexMetadataId: indexId, + fieldMetadataUniversalIdentifier: + flatFieldMetadata.universalIdentifier, + indexMetadataUniversalIdentifier, order: 0, updatedAt: createdAt, }, ], - id: indexId, indexType: IndexType.BTREE, indexWhereClause: null, isCustom: true, isUnique: flatFieldMetadata.isUnique ?? false, - objectMetadataId: flatObjectMetadata.id, objectMetadataUniversalIdentifier: flatObjectMetadata.universalIdentifier, - universalIdentifier: indexId, + universalIdentifier: indexMetadataUniversalIdentifier, updatedAt: createdAt, - workspaceId, - applicationId: flatFieldMetadata.applicationId, applicationUniversalIdentifier: flatFieldMetadata.applicationUniversalIdentifier, }, flatObjectMetadata, - }, - ); + }); return flatIndex; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/generate-morph-or-relation-flat-field-metadata-pair.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/generate-morph-or-relation-flat-field-metadata-pair.util.ts index 3ad823de53..cf0ab772f2 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/generate-morph-or-relation-flat-field-metadata-pair.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/generate-morph-or-relation-flat-field-metadata-pair.util.ts @@ -13,27 +13,23 @@ import { computeMorphOrRelationFieldJoinColumnName } from 'src/engine/metadata-m import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { generateIndexForFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/generate-index-for-flat-field-metadata.util'; import { getDefaultFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util'; -import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { buildDescriptionForRelationFieldMetadataOnFromField } from 'src/engine/metadata-modules/object-metadata/utils/build-description-for-relation-field-on-from-field.util'; import { buildDescriptionForRelationFieldMetadataOnToField } from 'src/engine/metadata-modules/object-metadata/utils/build-description-for-relation-field-on-to-field.util'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; type ComputeFieldMetadataRelationSettingsForRelationTypeArgs = { relationType: RelationType; joinColumnName: string; - junctionTargetFieldId?: string; junctionTargetFieldUniversalIdentifier?: string; }; const computeFieldMetadataRelationSettingsForRelationType = ({ relationType, joinColumnName, - junctionTargetFieldId, junctionTargetFieldUniversalIdentifier, -}: ComputeFieldMetadataRelationSettingsForRelationTypeArgs): Pick< - FlatFieldMetadata, - 'settings' | 'universalSettings' -> => { +}: ComputeFieldMetadataRelationSettingsForRelationTypeArgs): FlatFieldMetadata['universalSettings'] => { if (relationType === RelationType.MANY_TO_ONE) { const settings = { relationType: RelationType.MANY_TO_ONE, @@ -41,33 +37,26 @@ const computeFieldMetadataRelationSettingsForRelationType = ({ joinColumnName, }; - return { settings, universalSettings: settings }; + return settings; } return { - settings: { - relationType: RelationType.ONE_TO_MANY, - ...(junctionTargetFieldId && { junctionTargetFieldId }), - }, - universalSettings: { - relationType: RelationType.ONE_TO_MANY, - ...(junctionTargetFieldUniversalIdentifier && { - junctionTargetFieldUniversalIdentifier, - }), - }, + relationType: RelationType.ONE_TO_MANY, + ...(junctionTargetFieldUniversalIdentifier && { + junctionTargetFieldUniversalIdentifier, + }), }; }; type GenerateMorphOrRelationFlatFieldMetadataPairArgs = { - targetFlatObjectMetadata: FlatObjectMetadata; - sourceFlatObjectMetadata: FlatObjectMetadata; + targetFlatObjectMetadata: UniversalFlatObjectMetadata; + sourceFlatObjectMetadata: UniversalFlatObjectMetadata; targetFlatFieldMetadataType: FieldMetadataType; sourceFlatObjectMetadataJoinColumnName: string; - createFieldInput: Omit & + createFieldInput: Omit & Required< Pick > & { type: MorphOrRelationFieldMetadataType }; - workspaceId: string; morphId?: string | null; flatApplication: FlatApplication; targetFieldName?: string; @@ -75,8 +64,8 @@ type GenerateMorphOrRelationFlatFieldMetadataPairArgs = { }; export type SourceTargetMorphOrRelationFlatFieldAndFlatIndex = { - flatFieldMetadatas: FlatFieldMetadata[]; - indexMetadatas: FlatIndexMetadata[]; + flatFieldMetadatas: UniversalFlatFieldMetadata[]; + indexMetadatas: UniversalFlatIndexMetadata[]; }; export const generateMorphOrRelationFlatFieldMetadataPair = ({ @@ -84,7 +73,6 @@ export const generateMorphOrRelationFlatFieldMetadataPair = ({ sourceFlatObjectMetadata, targetFlatObjectMetadata, targetFlatFieldMetadataType, - workspaceId, flatApplication, sourceFlatObjectMetadataJoinColumnName, morphId = null, @@ -95,18 +83,14 @@ export const generateMorphOrRelationFlatFieldMetadataPair = ({ const { relationCreationPayload } = createFieldInput; - const { - settings: sourceFlatFieldMetadataSettings, - universalSettings: sourceFlatFieldMetadataUniversalSettings, - } = computeFieldMetadataRelationSettingsForRelationType({ - joinColumnName: sourceFlatObjectMetadataJoinColumnName, - relationType: relationCreationPayload.type, - junctionTargetFieldId: junctionTargetFlatFieldMetadata?.id, - junctionTargetFieldUniversalIdentifier: - junctionTargetFlatFieldMetadata?.universalIdentifier, - }); - const targetRelationTargetFieldMetadataId = v4(); - const sourceRelationTargetFieldMetadataId = v4(); + const sourceFlatFieldMetadataUniversalSettings = + computeFieldMetadataRelationSettingsForRelationType({ + joinColumnName: sourceFlatObjectMetadataJoinColumnName, + relationType: relationCreationPayload.type, + junctionTargetFieldUniversalIdentifier: + junctionTargetFlatFieldMetadata?.universalIdentifier, + }); + const sourceFieldUniversalIdentifier = v4(); const targetFieldUniversalIdentifier = v4(); const defaultDescriptionFromField = @@ -119,40 +103,40 @@ export const generateMorphOrRelationFlatFieldMetadataPair = ({ relationObjectMetadataNamePlural: targetFlatObjectMetadata.namePlural, targetObjectLabelSingular: sourceFlatObjectMetadata.labelSingular, }); - const sourceFlatFieldMetadata: Omit< - FlatFieldMetadata, - 'flatRelationTargetFieldMetadata' - > = { - ...getDefaultFlatFieldMetadata({ - createFieldInput, - workspaceId, - fieldMetadataId: sourceRelationTargetFieldMetadataId, - flatApplication, - objectMetadataUniversalIdentifier: - sourceFlatObjectMetadata.universalIdentifier, - }), - morphId: - sourceFlatFieldMetadataType === FieldMetadataType.MORPH_RELATION - ? morphId - : null, - objectMetadataId: sourceFlatObjectMetadata.id, - icon: createFieldInput.icon ?? 'IconRelationOneToMany', - type: sourceFlatFieldMetadataType, - description: - createFieldInput.description ?? defaultDescriptionFromField.description, - defaultValue: null, - settings: sourceFlatFieldMetadataSettings, - universalSettings: sourceFlatFieldMetadataUniversalSettings, - options: null, - relationTargetFieldMetadataId: targetRelationTargetFieldMetadataId, - relationTargetObjectMetadataId: targetFlatObjectMetadata.id, - relationTargetObjectMetadataUniversalIdentifier: - targetFlatObjectMetadata.universalIdentifier, - relationTargetFieldMetadataUniversalIdentifier: - targetFieldUniversalIdentifier, - }; + const sourceFlatFieldMetadata: UniversalFlatFieldMetadata = + { + ...getDefaultFlatFieldMetadata({ + createFieldInput: { + ...createFieldInput, + universalIdentifier: + createFieldInput.universalIdentifier ?? + sourceFieldUniversalIdentifier, + }, + flatApplication, + objectMetadataUniversalIdentifier: + sourceFlatObjectMetadata.universalIdentifier, + }), + morphId: + sourceFlatFieldMetadataType === FieldMetadataType.MORPH_RELATION + ? morphId + : null, + icon: createFieldInput.icon ?? 'IconRelationOneToMany', + type: sourceFlatFieldMetadataType, + description: + createFieldInput.description ?? defaultDescriptionFromField.description, + defaultValue: null, + universalSettings: sourceFlatFieldMetadataUniversalSettings, + options: null, + relationTargetObjectMetadataUniversalIdentifier: + targetFlatObjectMetadata.universalIdentifier, + relationTargetFieldMetadataUniversalIdentifier: + targetFieldUniversalIdentifier, + }; - const targetCreateFieldInput: CreateFieldInput = { + const targetCreateFieldInput: Omit< + CreateFieldInput, + 'objectMetadataId' | 'workspaceId' + > = { icon: relationCreationPayload.targetFieldIcon ?? 'Icon123', description: createFieldInput.description ?? defaultDescriptionToField.description, @@ -162,25 +146,21 @@ export const generateMorphOrRelationFlatFieldMetadataPair = ({ computeMetadataNameFromLabel({ label: relationCreationPayload.targetFieldLabel, }), - objectMetadataId: targetFlatObjectMetadata.id, type: FieldMetadataType.RELATION, - workspaceId, isSystem: createFieldInput.isSystem ?? false, }; - const { - settings: targetFlatFieldMetadataSettings, - universalSettings: targetFlatFieldMetadataUniversalSettings, - } = computeFieldMetadataRelationSettingsForRelationType({ - joinColumnName: computeMorphOrRelationFieldJoinColumnName({ - name: targetCreateFieldInput.name, - }), - relationType: - relationCreationPayload.type === RelationType.ONE_TO_MANY - ? RelationType.MANY_TO_ONE - : RelationType.ONE_TO_MANY, - }); + const targetFlatFieldMetadataUniversalSettings = + computeFieldMetadataRelationSettingsForRelationType({ + joinColumnName: computeMorphOrRelationFieldJoinColumnName({ + name: targetCreateFieldInput.name, + }), + relationType: + relationCreationPayload.type === RelationType.ONE_TO_MANY + ? RelationType.MANY_TO_ONE + : RelationType.ONE_TO_MANY, + }); - const targetFlatFieldMetadata: FlatFieldMetadata< + const targetFlatFieldMetadata: UniversalFlatFieldMetadata< typeof targetFlatFieldMetadataType > = { ...getDefaultFlatFieldMetadata({ @@ -188,8 +168,6 @@ export const generateMorphOrRelationFlatFieldMetadataPair = ({ ...targetCreateFieldInput, universalIdentifier: targetFieldUniversalIdentifier, }, - workspaceId, - fieldMetadataId: targetRelationTargetFieldMetadataId, flatApplication, objectMetadataUniversalIdentifier: targetFlatObjectMetadata.universalIdentifier, @@ -200,28 +178,25 @@ export const generateMorphOrRelationFlatFieldMetadataPair = ({ : null, type: targetFlatFieldMetadataType, defaultValue: null, - settings: targetFlatFieldMetadataSettings, universalSettings: targetFlatFieldMetadataUniversalSettings, options: null, - relationTargetFieldMetadataId: sourceRelationTargetFieldMetadataId, - relationTargetObjectMetadataId: sourceFlatObjectMetadata.id, relationTargetObjectMetadataUniversalIdentifier: sourceFlatObjectMetadata.universalIdentifier, relationTargetFieldMetadataUniversalIdentifier: sourceFlatFieldMetadata.universalIdentifier, }; - const indexMetadata: FlatIndexMetadata = generateIndexForFlatFieldMetadata({ - flatFieldMetadata: - relationCreationPayload.type === RelationType.MANY_TO_ONE - ? sourceFlatFieldMetadata - : targetFlatFieldMetadata, - flatObjectMetadata: - relationCreationPayload.type === RelationType.MANY_TO_ONE - ? sourceFlatObjectMetadata - : targetFlatObjectMetadata, - workspaceId, - }); + const indexMetadata: UniversalFlatIndexMetadata = + generateIndexForFlatFieldMetadata({ + flatFieldMetadata: + relationCreationPayload.type === RelationType.MANY_TO_ONE + ? sourceFlatFieldMetadata + : targetFlatFieldMetadata, + flatObjectMetadata: + relationCreationPayload.type === RelationType.MANY_TO_ONE + ? sourceFlatObjectMetadata + : targetFlatObjectMetadata, + }); return { flatFieldMetadatas: [sourceFlatFieldMetadata, targetFlatFieldMetadata], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util.ts index a9fad83e9f..8bd295cf98 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util.ts @@ -5,19 +5,15 @@ import { type FlatApplication } from 'src/engine/core-modules/application/types/ import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input'; import { generateDefaultValue } from 'src/engine/metadata-modules/field-metadata/utils/generate-default-value'; import { generateNullable } from 'src/engine/metadata-modules/field-metadata/utils/generate-nullable'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; type GetDefaultFlatFieldMetadataArgs = { - fieldMetadataId: string; - createFieldInput: Omit; - workspaceId: string; + createFieldInput: Omit; flatApplication: FlatApplication; objectMetadataUniversalIdentifier: string; }; export const getDefaultFlatFieldMetadata = ({ createFieldInput, - fieldMetadataId, - workspaceId, flatApplication, objectMetadataUniversalIdentifier, }: GetDefaultFlatFieldMetadataArgs) => { @@ -29,11 +25,7 @@ export const getDefaultFlatFieldMetadata = ({ const createdAt = new Date().toISOString(); return { - calendarViewIds: [], - mainGroupByFieldMetadataViewIds: [], - viewFieldIds: [], description: createFieldInput.description ?? null, - id: fieldMetadataId, icon: createFieldInput.icon ?? null, isActive: true, isCustom: true, @@ -46,23 +38,15 @@ export const getDefaultFlatFieldMetadata = ({ isUnique: createFieldInput.isUnique ?? false, label: createFieldInput.label, name: createFieldInput.name, - objectMetadataId: createFieldInput.objectMetadataId, - relationTargetFieldMetadataId: null, - relationTargetObjectMetadataId: null, standardOverrides: null, type: createFieldInput.type, universalIdentifier: createFieldInput.universalIdentifier ?? v4(), - workspaceId, options: createFieldInput.options ?? null, defaultValue: defaultValue ?? generateDefaultValue(createFieldInput.type), - settings: settings ?? null, createdAt, updatedAt: createdAt, isUIReadOnly: createFieldInput.isUIReadOnly ?? false, morphId: null, - applicationId: flatApplication.id, - viewFilterIds: [], - kanbanAggregateOperationViewIds: [], applicationUniversalIdentifier: flatApplication.universalIdentifier, objectMetadataUniversalIdentifier, relationTargetObjectMetadataUniversalIdentifier: null, @@ -73,5 +57,5 @@ export const getDefaultFlatFieldMetadata = ({ calendarViewUniversalIdentifiers: [], mainGroupByFieldMetadataViewUniversalIdentifiers: [], universalSettings: settings ?? null, - } as const satisfies FlatFieldMetadata; + } as const satisfies UniversalFlatFieldMetadata; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-object-field-names-and-join-column-names.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-object-field-names-and-join-column-names.util.ts index b1fb3bd0fa..d4277fa2bc 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-object-field-names-and-join-column-names.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-object-field-names-and-join-column-names.util.ts @@ -1,59 +1,64 @@ import { RelationType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-universal-identifier-in-universal-flat-entity-maps-or-throw.util'; +import { isMorphOrRelationUniversalFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; type ObjectFieldNamesAndJoinColumnNames = { fieldNames: string[]; joinColumnNames: string[]; }; export const getObjectFieldNamesAndJoinColumnNames = ({ - flatFieldMetadataMaps, - flatObjectMetadata, + universalFlatFieldMetadataMaps, + universalFlatObjectMetadata, }: { - flatObjectMetadata: FlatObjectMetadata; - flatFieldMetadataMaps: FlatEntityMaps; + universalFlatObjectMetadata: UniversalFlatObjectMetadata; + universalFlatFieldMetadataMaps: UniversalFlatEntityMaps; }): { objectFieldNamesAndJoinColumnNames: ObjectFieldNamesAndJoinColumnNames; } => { - const objectFlatFieldMetadatas = - findManyFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityMaps: flatFieldMetadataMaps, - flatEntityIds: flatObjectMetadata.fieldIds, + const objectUniversalFlatFieldMetadatas = + findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow({ + flatEntityMaps: universalFlatFieldMetadataMaps, + universalIdentifiers: + universalFlatObjectMetadata.fieldUniversalIdentifiers, }); const initialAccumulator: ObjectFieldNamesAndJoinColumnNames = { joinColumnNames: [], fieldNames: [], }; - const objectFieldNamesAndJoinColumnNames = objectFlatFieldMetadatas.reduce( - (acc, flatFieldMetadata) => { - if ( - isMorphOrRelationFlatFieldMetadata(flatFieldMetadata) && - flatFieldMetadata.settings.relationType === RelationType.MANY_TO_ONE && - isDefined(flatFieldMetadata.settings.joinColumnName) - ) { + const objectFieldNamesAndJoinColumnNames = + objectUniversalFlatFieldMetadatas.reduce( + (acc, universalFlatFieldMetadata) => { + if ( + isMorphOrRelationUniversalFlatFieldMetadata( + universalFlatFieldMetadata, + ) && + universalFlatFieldMetadata.universalSettings.relationType === + RelationType.MANY_TO_ONE && + isDefined(universalFlatFieldMetadata.universalSettings.joinColumnName) + ) { + return { + ...acc, + fieldNames: [...acc.fieldNames, universalFlatFieldMetadata.name], + joinColumnNames: [ + ...acc.joinColumnNames, + universalFlatFieldMetadata.universalSettings.joinColumnName, + ], + }; + } + return { ...acc, - fieldNames: [...acc.fieldNames, flatFieldMetadata.name], - joinColumnNames: [ - ...acc.joinColumnNames, - flatFieldMetadata.settings.joinColumnName, - ], + fieldNames: [...acc.fieldNames, universalFlatFieldMetadata.name], }; - } - - return { - ...acc, - fieldNames: [...acc.fieldNames, flatFieldMetadata.name], - }; - }, - initialAccumulator, - ); + }, + initialAccumulator, + ); return { objectFieldNamesAndJoinColumnNames }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/handle-field-metadata-deactivation-side-effects.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/handle-field-metadata-deactivation-side-effects.util.ts index 3fcc842ff3..3b3222702c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/handle-field-metadata-deactivation-side-effects.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/handle-field-metadata-deactivation-side-effects.util.ts @@ -96,6 +96,7 @@ export const handleFieldMetadataDeactivationSideEffects = ({ ...flatView, kanbanAggregateOperation: null, kanbanAggregateOperationFieldMetadataId: null, + kanbanAggregateOperationFieldMetadataUniversalIdentifier: null, })); return { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/handle-index-changes-during-field-update.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/handle-index-changes-during-field-update.util.ts index 231db1361a..6806acf177 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/handle-index-changes-during-field-update.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/handle-index-changes-during-field-update.util.ts @@ -14,11 +14,12 @@ import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/ import { recomputeIndexOnFlatFieldMetadataNameUpdate } from 'src/engine/metadata-modules/flat-field-metadata/utils/recompute-index-on-flat-field-metadata-name-update.util'; import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; export type FieldMetadataUpdateIndexSideEffect = { - flatIndexMetadatasToUpdate: FlatIndexMetadata[]; - flatIndexMetadatasToDelete: FlatIndexMetadata[]; - flatIndexMetadatasToCreate: FlatIndexMetadata[]; + flatIndexMetadatasToUpdate: UniversalFlatIndexMetadata[]; + flatIndexMetadatasToDelete: UniversalFlatIndexMetadata[]; + flatIndexMetadatasToCreate: UniversalFlatIndexMetadata[]; }; type FromToFlatFieldMetadataAndFlatEntityMaps = FromTo< @@ -110,7 +111,6 @@ const handleNoExistingIndexes = ({ const newIndex = generateIndexForFlatFieldMetadata({ flatFieldMetadata: toFlatFieldMetadata, flatObjectMetadata, - workspaceId: flatObjectMetadata.workspaceId, }); return { @@ -146,7 +146,6 @@ const handleExistingIndexes = ({ isUnique: true, }, flatObjectMetadata, - workspaceId: flatObjectMetadata.workspaceId, }); const uniqueIndexToDelete = relatedIndexes.find( diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/handle-label-identifier-changes-during-field-update.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/handle-label-identifier-changes-during-field-update.util.ts index 53d8b63a33..6e47031bc6 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/handle-label-identifier-changes-during-field-update.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/handle-label-identifier-changes-during-field-update.util.ts @@ -58,8 +58,8 @@ export const handleLabelIdentifierChangesDuringFieldUpdate = ({ return { ...searchVectorField, - settings: { - ...searchVectorField.settings, + universalSettings: { + ...searchVectorField.universalSettings, asExpression: newAsExpression, }, }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-index-on-flat-field-metadata-name-update.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-index-on-flat-field-metadata-name-update.util.ts index 6c578101e1..8f8934e4f9 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-index-on-flat-field-metadata-name-update.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-index-on-flat-field-metadata-name-update.util.ts @@ -4,6 +4,7 @@ import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-m import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { generateFlatIndexMetadataWithNameOrThrow } from 'src/engine/metadata-modules/index-metadata/utils/generate-flat-index.util'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; type RecomputeIndexOnFlatFieldMetadataNameUpdateArgs = { flatObjectMetadata: FlatObjectMetadata; @@ -18,7 +19,7 @@ export const recomputeIndexOnFlatFieldMetadataNameUpdate = ({ flatObjectMetadata, flatFieldMetadataMaps, relatedFlatIndexMetadata, -}: RecomputeIndexOnFlatFieldMetadataNameUpdateArgs): FlatIndexMetadata[] => { +}: RecomputeIndexOnFlatFieldMetadataNameUpdateArgs): UniversalFlatIndexMetadata[] => { if (relatedFlatIndexMetadata.length === 0) { return []; } diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/__tests__/validate-files-flat-field-metadata.util.spec.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/__tests__/validate-files-flat-field-metadata.util.spec.ts index e4b7b1cadc..fb88af2116 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/__tests__/validate-files-flat-field-metadata.util.spec.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/__tests__/validate-files-flat-field-metadata.util.spec.ts @@ -1,33 +1,36 @@ import { FieldMetadataType } from 'twenty-shared/types'; -import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { type FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type'; import { validateFilesFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-files-flat-field-metadata.util'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; const createFlatEntityToValidate = ( - overrides: Partial> = {}, -): FlatFieldMetadata => + overrides: Partial> = {}, +): UniversalFlatFieldMetadata => ({ type: FieldMetadataType.FILES, name: 'testFilesField', label: 'Test Files Field', - settings: { maxNumberOfValues: 5 }, + universalSettings: { maxNumberOfValues: 5 }, isUnique: false, ...overrides, - }) as FlatFieldMetadata; + }) as UniversalFlatFieldMetadata; const callValidator = ( - flatEntityToValidate: FlatFieldMetadata, + flatEntityToValidate: UniversalFlatFieldMetadata, ) => validateFilesFlatFieldMetadata({ flatEntityToValidate, } as Parameters[0]); +const stripUserFriendlyMessage = (errors: FlatFieldMetadataValidationError[]) => + errors.map(({ userFriendlyMessage: _, ...rest }) => rest); + describe('validateFilesFlatFieldMetadata', () => { it('should return no errors for a valid files field', () => { const errors = callValidator(createFlatEntityToValidate()); - expect(errors).toHaveLength(0); + expect(errors).toMatchInlineSnapshot('[]'); }); it('should return error when isUnique is true', () => { @@ -35,40 +38,62 @@ describe('validateFilesFlatFieldMetadata', () => { createFlatEntityToValidate({ isUnique: true }), ); - expect(errors).toHaveLength(1); - expect(errors[0].code).toBe(FieldMetadataExceptionCode.INVALID_FIELD_INPUT); - expect(errors[0].message).toContain( - 'Files field is not supported for unique fields', - ); + expect(stripUserFriendlyMessage(errors)).toMatchInlineSnapshot(` +[ + { + "code": "INVALID_FIELD_INPUT", + "message": "Files field is not supported for unique fields", + }, +] +`); }); - it('should return error when settings is undefined', () => { + it('should return error when universalSettings is undefined', () => { const errors = callValidator( - createFlatEntityToValidate({ settings: undefined }), + createFlatEntityToValidate({ universalSettings: undefined }), ); - expect(errors).toHaveLength(1); - expect(errors[0].code).toBe(FieldMetadataExceptionCode.INVALID_FIELD_INPUT); - expect(errors[0].message).toContain( - 'maxNumberOfValues must be defined in settings', - ); + expect(stripUserFriendlyMessage(errors)).toMatchInlineSnapshot(` +[ + { + "code": "INVALID_FIELD_INPUT", + "message": "maxNumberOfValues must be defined in settings and be a number greater than 0 and less than or equal to 10", + }, +] +`); }); it('should return error when maxNumberOfValues is 0', () => { const errors = callValidator( - createFlatEntityToValidate({ settings: { maxNumberOfValues: 0 } }), + createFlatEntityToValidate({ + universalSettings: { maxNumberOfValues: 0 }, + }), ); - expect(errors).toHaveLength(1); - expect(errors[0].code).toBe(FieldMetadataExceptionCode.INVALID_FIELD_INPUT); + expect(stripUserFriendlyMessage(errors)).toMatchInlineSnapshot(` +[ + { + "code": "INVALID_FIELD_INPUT", + "message": "maxNumberOfValues must be defined in settings and be a number greater than 0 and less than or equal to 10", + }, +] +`); }); it('should return error when maxNumberOfValues exceeds max (11)', () => { const errors = callValidator( - createFlatEntityToValidate({ settings: { maxNumberOfValues: 11 } }), + createFlatEntityToValidate({ + universalSettings: { maxNumberOfValues: 11 }, + }), ); - expect(errors).toHaveLength(1); - expect(errors[0].code).toBe(FieldMetadataExceptionCode.INVALID_FIELD_INPUT); + expect(stripUserFriendlyMessage(errors)).toMatchInlineSnapshot(` +[ + { + "code": "INVALID_FIELD_INPUT", + "message": "maxNumberOfValues must be defined in settings and be a number greater than 0 and less than or equal to 10", + }, +] +`); }); }); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-enum-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-enum-flat-field-metadata.util.ts index 31da76eb35..273eaebc5f 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-enum-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-enum-flat-field-metadata.util.ts @@ -17,9 +17,9 @@ import { import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; import { type FlatFieldMetadataTypeValidationArgs } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-type-validator.type'; import { type FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { IDENTIFIER_MAX_CHAR_LENGTH } from 'src/engine/metadata-modules/utils/constants/identifier-max-char-length.constants'; import { IDENTIFIER_MIN_CHAR_LENGTH } from 'src/engine/metadata-modules/utils/constants/identifier-min-char-length.constants'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; import { isSnakeCaseString } from 'src/utils/is-snake-case-string'; const validateMetadataOptionId = (sanitizedId?: string) => { @@ -198,9 +198,9 @@ const validateDuplicates = ( }; const validateFieldMetadataInputOptions = ( - flatFieldMetadata: FlatFieldMetadata, + universalFlatFieldMetadata: UniversalFlatFieldMetadata, ): FlatFieldMetadataValidationError[] => { - const { options } = flatFieldMetadata; + const { options } = universalFlatFieldMetadata; if (!isDefined(options) || options.length === 0) { return [ @@ -328,9 +328,9 @@ const validateFieldMetadataDefaultValue = ({ defaultValue, options, type, -}: Omit, 'defaultValue'> & +}: Omit, 'defaultValue'> & NonNullableRequired< - Pick, 'defaultValue'> + Pick, 'defaultValue'> >) => { switch (type) { case FieldMetadataType.SELECT: @@ -354,18 +354,18 @@ const validateFieldMetadataDefaultValue = ({ }; export const validateEnumSelectFlatFieldMetadata = ({ - flatEntityToValidate: flatFieldMetadataToValidate, + flatEntityToValidate: universalFlatFieldMetadataToValidate, }: FlatFieldMetadataTypeValidationArgs): FlatFieldMetadataValidationError[] => { const optionsValidationErrors = validateFieldMetadataInputOptions( - flatFieldMetadataToValidate, + universalFlatFieldMetadataToValidate, ); const defaultValueValidationErrors = isDefined( - flatFieldMetadataToValidate.defaultValue, + universalFlatFieldMetadataToValidate.defaultValue, ) ? validateFieldMetadataDefaultValue({ - ...flatFieldMetadataToValidate, - defaultValue: flatFieldMetadataToValidate.defaultValue, + ...universalFlatFieldMetadataToValidate, + defaultValue: universalFlatFieldMetadataToValidate.defaultValue, }) : []; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-files-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-files-flat-field-metadata.util.ts index fa20c5f219..05e9fd3542 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-files-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-files-flat-field-metadata.util.ts @@ -21,9 +21,9 @@ export const validateFilesFlatFieldMetadata = ({ } if ( - !isDefined(flatEntityToValidate?.settings?.maxNumberOfValues) || - flatEntityToValidate.settings.maxNumberOfValues < 1 || - flatEntityToValidate.settings.maxNumberOfValues > + !isDefined(flatEntityToValidate?.universalSettings?.maxNumberOfValues) || + flatEntityToValidate.universalSettings.maxNumberOfValues < 1 || + flatEntityToValidate.universalSettings.maxNumberOfValues > FILES_FIELD_MAX_NUMBER_OF_VALUES ) { errors.push({ diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name-availability.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name-availability.util.ts index 5f58a8b4ef..77f4e08ded 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name-availability.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name-availability.util.ts @@ -5,56 +5,59 @@ import { isDefined } from 'twenty-shared/utils'; import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; import { computeCompositeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util'; import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util'; -import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-universal-identifier-in-universal-flat-entity-maps-or-throw.util'; import { type FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { getObjectFieldNamesAndJoinColumnNames } from 'src/engine/metadata-modules/flat-field-metadata/utils/get-object-field-names-and-join-column-names.util'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-builder-options.type'; const getReservedCompositeFieldNames = ( - objectFlatFieldMetadatas: FlatFieldMetadata[], + objectUniversalFlatFieldMetadatas: UniversalFlatFieldMetadata[], ): string[] => { - return objectFlatFieldMetadatas.flatMap((flatFieldMetadata) => { - if (isCompositeFieldMetadataType(flatFieldMetadata.type)) { - const base = flatFieldMetadata.name; - const compositeType = compositeTypeDefinitions.get( - flatFieldMetadata.type, - ); + return objectUniversalFlatFieldMetadatas.flatMap( + (universalFlatFieldMetadata) => { + if (isCompositeFieldMetadataType(universalFlatFieldMetadata.type)) { + const base = universalFlatFieldMetadata.name; + const compositeType = compositeTypeDefinitions.get( + universalFlatFieldMetadata.type, + ); - if (!isDefined(compositeType)) { - return []; + if (!isDefined(compositeType)) { + return []; + } + + return compositeType.properties.map((property) => + computeCompositeColumnName(base, property), + ); } - return compositeType.properties.map((property) => - computeCompositeColumnName(base, property), - ); - } - - return []; - }); + return []; + }, + ); }; export const validateFlatFieldMetadataNameAvailability = ({ name, - flatFieldMetadataMaps, - flatObjectMetadata, + universalFlatFieldMetadataMaps, + universalFlatObjectMetadata, buildOptions, }: { buildOptions: WorkspaceMigrationBuilderOptions; name: string; - flatObjectMetadata: FlatObjectMetadata; - flatFieldMetadataMaps: FlatEntityMaps; + universalFlatObjectMetadata: UniversalFlatObjectMetadata; + universalFlatFieldMetadataMaps: UniversalFlatEntityMaps; }): FlatFieldMetadataValidationError[] => { const errors: FlatFieldMetadataValidationError[] = []; - const objectFlatFieldMetadatas = - findManyFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityMaps: flatFieldMetadataMaps, - flatEntityIds: flatObjectMetadata.fieldIds, + const objectUniversalFlatFieldMetadatas = + findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow({ + flatEntityMaps: universalFlatFieldMetadataMaps, + universalIdentifiers: + universalFlatObjectMetadata.fieldUniversalIdentifiers, }); const reservedCompositeFieldsNames = getReservedCompositeFieldNames( - objectFlatFieldMetadatas, + objectUniversalFlatFieldMetadatas, ); if ( @@ -71,8 +74,8 @@ export const validateFlatFieldMetadataNameAvailability = ({ const { objectFieldNamesAndJoinColumnNames } = getObjectFieldNamesAndJoinColumnNames({ - flatFieldMetadataMaps, - flatObjectMetadata, + universalFlatFieldMetadataMaps, + universalFlatObjectMetadata, }); if (objectFieldNamesAndJoinColumnNames.fieldNames.includes(name)) { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-junction-target-settings.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-junction-target-settings.util.ts index 6d05d069ce..db95f7a287 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-junction-target-settings.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-junction-target-settings.util.ts @@ -1,19 +1,19 @@ import { type MessageDescriptor } from '@lingui/core'; import { msg } from '@lingui/core/macro'; import { FieldMetadataType, RelationType } from 'twenty-shared/types'; -import { isDefined, isValidUuid } from 'twenty-shared/utils'; +import { isDefined } from 'twenty-shared/utils'; import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type'; -import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { type FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; +import { isMorphOrRelationUniversalFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; type ValidateJunctionTargetSettingsArgs = { - flatFieldMetadata: FlatFieldMetadata; - flatFieldMetadataMaps: FlatEntityMaps; + universalFlatFieldMetadata: UniversalFlatFieldMetadata; + flatFieldMetadataMaps: UniversalFlatEntityMaps; }; const createError = ( @@ -29,18 +29,22 @@ const createError = ( }); export const validateJunctionTargetSettings = ({ - flatFieldMetadata, + universalFlatFieldMetadata, flatFieldMetadataMaps, }: ValidateJunctionTargetSettingsArgs): FlatFieldMetadataValidationError[] => { - const { settings } = flatFieldMetadata; + const { universalSettings } = universalFlatFieldMetadata; - const junctionTargetFieldId = settings.junctionTargetFieldId; + const junctionTargetFieldUniversalIdentifier = + universalSettings.junctionTargetFieldUniversalIdentifier; - if (!isDefined(junctionTargetFieldId) || junctionTargetFieldId.length === 0) { + if ( + !isDefined(junctionTargetFieldUniversalIdentifier) || + junctionTargetFieldUniversalIdentifier.length === 0 + ) { return []; } - if (settings.relationType !== RelationType.ONE_TO_MANY) { + if (universalSettings.relationType !== RelationType.ONE_TO_MANY) { return [ createError( FieldMetadataExceptionCode.INVALID_FIELD_INPUT, @@ -50,19 +54,8 @@ export const validateJunctionTargetSettings = ({ ]; } - if (!isValidUuid(junctionTargetFieldId)) { - return [ - createError( - FieldMetadataExceptionCode.INVALID_FIELD_INPUT, - `Invalid junction target field ID: ${junctionTargetFieldId}`, - msg`Invalid junction target field ID`, - junctionTargetFieldId, - ), - ]; - } - - const targetField = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: junctionTargetFieldId, + const targetField = findFlatEntityByUniversalIdentifier({ + universalIdentifier: junctionTargetFieldUniversalIdentifier, flatEntityMaps: flatFieldMetadataMaps, }); @@ -70,34 +63,34 @@ export const validateJunctionTargetSettings = ({ return [ createError( FieldMetadataExceptionCode.FIELD_METADATA_NOT_FOUND, - `Junction target field not found: ${junctionTargetFieldId}`, + `Junction target field not found: ${junctionTargetFieldUniversalIdentifier}`, msg`Junction target field not found`, - junctionTargetFieldId, + junctionTargetFieldUniversalIdentifier, ), ]; } if ( - targetField.objectMetadataId !== - flatFieldMetadata.relationTargetObjectMetadataId + targetField.objectMetadataUniversalIdentifier !== + universalFlatFieldMetadata.relationTargetObjectMetadataUniversalIdentifier ) { return [ createError( FieldMetadataExceptionCode.INVALID_FIELD_INPUT, - `Junction target field ${junctionTargetFieldId} is not on the junction object`, + `Junction target field ${junctionTargetFieldUniversalIdentifier} is not on the junction object`, msg`Junction target field must be on the junction object`, - junctionTargetFieldId, + junctionTargetFieldUniversalIdentifier, ), ]; } - if (!isMorphOrRelationFlatFieldMetadata(targetField)) { + if (!isMorphOrRelationUniversalFlatFieldMetadata(targetField)) { return [ createError( FieldMetadataExceptionCode.INVALID_FIELD_INPUT, - `Junction target field ${junctionTargetFieldId} is not a relation field`, + `Junction target field ${junctionTargetFieldUniversalIdentifier} is not a relation field`, msg`Junction target field must be a relation field`, - junctionTargetFieldId, + junctionTargetFieldUniversalIdentifier, ), ]; } @@ -107,13 +100,13 @@ export const validateJunctionTargetSettings = ({ return []; } - if (targetField.settings.relationType !== RelationType.MANY_TO_ONE) { + if (targetField.universalSettings.relationType !== RelationType.MANY_TO_ONE) { return [ createError( FieldMetadataExceptionCode.INVALID_FIELD_INPUT, - `Junction target field ${junctionTargetFieldId} is not a MANY_TO_ONE relation`, + `Junction target field ${junctionTargetFieldUniversalIdentifier} is not a MANY_TO_ONE relation`, msg`Junction target field must be a MANY_TO_ONE relation`, - junctionTargetFieldId, + junctionTargetFieldUniversalIdentifier, ), ]; } diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-or-relation-flat-field-join-column-name.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-or-relation-flat-field-join-column-name.util.ts index b4e0d3fd20..218ce20f11 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-or-relation-flat-field-join-column-name.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-or-relation-flat-field-join-column-name.util.ts @@ -4,15 +4,15 @@ import { assertUnreachable, isDefined } from 'twenty-shared/utils'; import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type'; -import { type MetadataFlatEntityAndRelatedFlatEntityMapsForValidation } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-and-related-flat-entity-maps-for-validation.type'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { type MetadataUniversalFlatEntityAndRelatedFlatEntityMapsForValidation } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-and-related-flat-entity-maps-for-validation.type'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { type FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { validateFlatFieldMetadataNameAvailability } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name-availability.util'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-builder-options.type'; export const validateMorphOrRelationFlatFieldJoinColumName = ({ - flatFieldMetadata, + universalFlatFieldMetadata, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatFieldMetadataMaps, flatObjectMetadataMaps, @@ -20,14 +20,16 @@ export const validateMorphOrRelationFlatFieldJoinColumName = ({ buildOptions, }: { buildOptions: WorkspaceMigrationBuilderOptions; - flatFieldMetadata: FlatFieldMetadata; - optimisticFlatEntityMapsAndRelatedFlatEntityMaps: MetadataFlatEntityAndRelatedFlatEntityMapsForValidation<'fieldMetadata'>; + universalFlatFieldMetadata: UniversalFlatFieldMetadata; + optimisticFlatEntityMapsAndRelatedFlatEntityMaps: MetadataUniversalFlatEntityAndRelatedFlatEntityMapsForValidation<'fieldMetadata'>; }): FlatFieldMetadataValidationError[] => { const errors: FlatFieldMetadataValidationError[] = []; - switch (flatFieldMetadata.settings.relationType) { + switch (universalFlatFieldMetadata.universalSettings.relationType) { case RelationType.MANY_TO_ONE: { - if (!isDefined(flatFieldMetadata.settings.joinColumnName)) { + if ( + !isDefined(universalFlatFieldMetadata.universalSettings.joinColumnName) + ) { errors.push({ code: FieldMetadataExceptionCode.INVALID_FIELD_INPUT, message: @@ -38,12 +40,13 @@ export const validateMorphOrRelationFlatFieldJoinColumName = ({ return errors; } - const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatFieldMetadata.objectMetadataId, + const universalFlatObjectMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + universalFlatFieldMetadata.objectMetadataUniversalIdentifier, flatEntityMaps: flatObjectMetadataMaps, }); - if (!isDefined(flatObjectMetadata)) { + if (!isDefined(universalFlatObjectMetadata)) { errors.push({ code: FieldMetadataExceptionCode.INVALID_FIELD_INPUT, message: 'Could not find relation field parent flat object', @@ -55,16 +58,18 @@ export const validateMorphOrRelationFlatFieldJoinColumName = ({ errors.push( ...validateFlatFieldMetadataNameAvailability({ - name: flatFieldMetadata.settings.joinColumnName, - flatFieldMetadataMaps, - flatObjectMetadata, + name: universalFlatFieldMetadata.universalSettings.joinColumnName, + universalFlatFieldMetadataMaps: flatFieldMetadataMaps, + universalFlatObjectMetadata, buildOptions, }), ); break; } case RelationType.ONE_TO_MANY: { - if (isDefined(flatFieldMetadata.settings.joinColumnName)) { + if ( + isDefined(universalFlatFieldMetadata.universalSettings.joinColumnName) + ) { errors.push({ code: FieldMetadataExceptionCode.INVALID_FIELD_INPUT, message: @@ -75,7 +80,9 @@ export const validateMorphOrRelationFlatFieldJoinColumName = ({ break; } default: { - assertUnreachable(flatFieldMetadata.settings.relationType); + assertUnreachable( + universalFlatFieldMetadata.universalSettings.relationType, + ); } } diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-or-relation-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-or-relation-flat-field-metadata.util.ts index 7cd0721747..1ab8de32bd 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-or-relation-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-or-relation-flat-field-metadata.util.ts @@ -1,27 +1,27 @@ import { msg } from '@lingui/core/macro'; -import { isDefined, isValidUuid } from 'twenty-shared/utils'; +import { isDefined } from 'twenty-shared/utils'; import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type'; -import { type FlatEntityUpdate } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { type FlatFieldMetadataTypeValidationArgs } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-type-validator.type'; import { type FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; +import { isMorphOrRelationUniversalFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; import { validateJunctionTargetSettings } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-junction-target-settings.util'; import { validateMorphOrRelationFlatFieldJoinColumName } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-or-relation-flat-field-join-column-name.util'; import { validateMorphOrRelationFlatFieldOnDelete } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-or-relation-flat-field-on-delete.util'; +import { type UniversalFlatEntityUpdate } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-update.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; type ValidateMorphOrRelationFlatFieldMetadataUpdatesArgs = Omit< FlatFieldMetadataTypeValidationArgs, 'updates' > & { - update: FlatEntityUpdate<'fieldMetadata'>; + update: UniversalFlatEntityUpdate<'fieldMetadata'>; }; export const validateMorphOrRelationFlatFieldMetadataUpdates = ({ - flatEntityToValidate: flatFieldMetadataToValidate, + flatEntityToValidate: universalFlatFieldMetadata, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatFieldMetadataMaps, flatObjectMetadataMaps, @@ -31,8 +31,8 @@ export const validateMorphOrRelationFlatFieldMetadataUpdates = ({ }: ValidateMorphOrRelationFlatFieldMetadataUpdatesArgs): FlatFieldMetadataValidationError[] => { const errors: FlatFieldMetadataValidationError[] = []; - const fromFlatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatFieldMetadataToValidate.id, + const fromFlatFieldMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: universalFlatFieldMetadata.universalIdentifier, flatEntityMaps: flatFieldMetadataMaps, }); @@ -46,7 +46,7 @@ export const validateMorphOrRelationFlatFieldMetadataUpdates = ({ ]; } - if (!isMorphOrRelationFlatFieldMetadata(fromFlatFieldMetadata)) { + if (!isMorphOrRelationUniversalFlatFieldMetadata(fromFlatFieldMetadata)) { return [ { code: FieldMetadataExceptionCode.FIELD_METADATA_NOT_FOUND, @@ -56,10 +56,10 @@ export const validateMorphOrRelationFlatFieldMetadataUpdates = ({ ]; } - const toSettings = update.settings as - | FlatFieldMetadata['settings'] + const toSettings = update.universalSettings as + | UniversalFlatFieldMetadata['universalSettings'] | undefined; - const fromSettings = fromFlatFieldMetadata.settings; + const fromSettings = fromFlatFieldMetadata.universalSettings; const isJoinColumnNameUpdated = isDefined(toSettings?.joinColumnName) && @@ -70,7 +70,7 @@ export const validateMorphOrRelationFlatFieldMetadataUpdates = ({ errors.push( ...validateMorphOrRelationFlatFieldJoinColumName({ buildOptions, - flatFieldMetadata: flatFieldMetadataToValidate, + universalFlatFieldMetadata, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatFieldMetadataMaps, flatObjectMetadataMaps, @@ -81,7 +81,7 @@ export const validateMorphOrRelationFlatFieldMetadataUpdates = ({ errors.push( ...validateMorphOrRelationFlatFieldOnDelete({ - flatFieldMetadata: flatFieldMetadataToValidate, + universalFlatFieldMetadata, }), ); @@ -89,7 +89,7 @@ export const validateMorphOrRelationFlatFieldMetadataUpdates = ({ }; export const validateMorphOrRelationFlatFieldMetadata = ({ - flatEntityToValidate: flatFieldMetadataToValidate, + flatEntityToValidate: universalFlatFieldMetadataToValidate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatFieldMetadataMaps, flatObjectMetadataMaps, @@ -100,43 +100,45 @@ export const validateMorphOrRelationFlatFieldMetadata = ({ workspaceId, additionalCacheDataMaps, }: FlatFieldMetadataTypeValidationArgs): FlatFieldMetadataValidationError[] => { - const { relationTargetFieldMetadataId, relationTargetObjectMetadataId } = - flatFieldMetadataToValidate; + const { + relationTargetFieldMetadataUniversalIdentifier, + relationTargetObjectMetadataUniversalIdentifier, + } = universalFlatFieldMetadataToValidate; - const uuidsValidation = [ - relationTargetObjectMetadataId, - relationTargetFieldMetadataId, - ].flatMap((id) => - isValidUuid(id) + const universalIdentifiersValidation = [ + relationTargetObjectMetadataUniversalIdentifier, + relationTargetFieldMetadataUniversalIdentifier, + ].flatMap((universalIdentifier) => + isDefined(universalIdentifier) ? [] : { code: FieldMetadataExceptionCode.INVALID_FIELD_INPUT, - message: `Invalid uuid ${id}`, - userFriendlyMessage: msg`Invalid uuid ${id}`, - value: id, + message: `Invalid universal identifier ${universalIdentifier}`, + userFriendlyMessage: msg`Invalid universal identifier ${universalIdentifier}`, + value: universalIdentifier, }, ); - if (uuidsValidation.length > 0) { - return uuidsValidation; + if (universalIdentifiersValidation.length > 0) { + return universalIdentifiersValidation; } const errors: FlatFieldMetadataValidationError[] = []; - const targetFlatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: relationTargetObjectMetadataId, + const targetFlatObjectMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: relationTargetObjectMetadataUniversalIdentifier, flatEntityMaps: flatObjectMetadataMaps, }); const targetFlatFieldMetadata = (remainingFlatEntityMapsToValidate - ? findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: relationTargetFieldMetadataId, + ? findFlatEntityByUniversalIdentifier({ + universalIdentifier: relationTargetFieldMetadataUniversalIdentifier, flatEntityMaps: remainingFlatEntityMapsToValidate, }) : undefined) ?? - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: relationTargetFieldMetadataId, + findFlatEntityByUniversalIdentifier({ + universalIdentifier: relationTargetFieldMetadataUniversalIdentifier, flatEntityMaps: flatFieldMetadataMaps, }); @@ -159,7 +161,7 @@ export const validateMorphOrRelationFlatFieldMetadata = ({ userFriendlyMessage: msg`Relation field target metadata not found`, }); } else { - if (!isMorphOrRelationFlatFieldMetadata(targetFlatFieldMetadata)) { + if (!isMorphOrRelationUniversalFlatFieldMetadata(targetFlatFieldMetadata)) { errors.push({ code: FieldMetadataExceptionCode.INVALID_FIELD_INPUT, message: @@ -168,8 +170,8 @@ export const validateMorphOrRelationFlatFieldMetadata = ({ }); } else { if ( - targetFlatFieldMetadata.objectMetadataId !== - flatFieldMetadataToValidate.relationTargetObjectMetadataId + targetFlatFieldMetadata.objectMetadataUniversalIdentifier !== + universalFlatFieldMetadataToValidate.relationTargetObjectMetadataUniversalIdentifier ) { errors.push({ code: FieldMetadataExceptionCode.INVALID_FIELD_INPUT, @@ -180,8 +182,8 @@ export const validateMorphOrRelationFlatFieldMetadata = ({ } if ( - targetFlatFieldMetadata.relationTargetObjectMetadataId !== - flatFieldMetadataToValidate.objectMetadataId + targetFlatFieldMetadata.relationTargetObjectMetadataUniversalIdentifier !== + universalFlatFieldMetadataToValidate.objectMetadataUniversalIdentifier ) { errors.push({ code: FieldMetadataExceptionCode.INVALID_FIELD_INPUT, @@ -192,8 +194,8 @@ export const validateMorphOrRelationFlatFieldMetadata = ({ } if ( - targetFlatFieldMetadata.relationTargetFieldMetadataId !== - flatFieldMetadataToValidate.id + targetFlatFieldMetadata.relationTargetFieldMetadataUniversalIdentifier !== + universalFlatFieldMetadataToValidate.universalIdentifier ) { errors.push({ code: FieldMetadataExceptionCode.INVALID_FIELD_INPUT, @@ -209,7 +211,7 @@ export const validateMorphOrRelationFlatFieldMetadata = ({ if (isDefined(update)) { errors.push( ...validateMorphOrRelationFlatFieldMetadataUpdates({ - flatEntityToValidate: flatFieldMetadataToValidate, + flatEntityToValidate: universalFlatFieldMetadataToValidate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatFieldMetadataMaps, flatObjectMetadataMaps, @@ -225,21 +227,21 @@ export const validateMorphOrRelationFlatFieldMetadata = ({ errors.push( ...validateMorphOrRelationFlatFieldJoinColumName({ buildOptions, - flatFieldMetadata: flatFieldMetadataToValidate, + universalFlatFieldMetadata: universalFlatFieldMetadataToValidate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatFieldMetadataMaps, flatObjectMetadataMaps, }, }), ...validateMorphOrRelationFlatFieldOnDelete({ - flatFieldMetadata: flatFieldMetadataToValidate, + universalFlatFieldMetadata: universalFlatFieldMetadataToValidate, }), ); } errors.push( ...validateJunctionTargetSettings({ - flatFieldMetadata: flatFieldMetadataToValidate, + universalFlatFieldMetadata: universalFlatFieldMetadataToValidate, flatFieldMetadataMaps, }), ); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-or-relation-flat-field-on-delete.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-or-relation-flat-field-on-delete.util.ts index 05c1f1ade4..11771b5c81 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-or-relation-flat-field-on-delete.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-or-relation-flat-field-on-delete.util.ts @@ -5,18 +5,19 @@ import { isDefined } from 'twenty-shared/utils'; import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type'; import { type FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; export const validateMorphOrRelationFlatFieldOnDelete = ({ - flatFieldMetadata, + universalFlatFieldMetadata, }: { - flatFieldMetadata: FlatFieldMetadata; + universalFlatFieldMetadata: UniversalFlatFieldMetadata; }): FlatFieldMetadataValidationError[] => { const errors: FlatFieldMetadataValidationError[] = []; if ( - isDefined(flatFieldMetadata.settings.onDelete) && - flatFieldMetadata.settings.relationType !== RelationType.MANY_TO_ONE + isDefined(universalFlatFieldMetadata.universalSettings.onDelete) && + universalFlatFieldMetadata.universalSettings.relationType !== + RelationType.MANY_TO_ONE ) { errors.push({ code: FieldMetadataExceptionCode.INVALID_FIELD_INPUT, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-relation-creation-payload.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-relation-creation-payload.util.ts index 563dd43704..c18e29b21d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-relation-creation-payload.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-relation-creation-payload.util.ts @@ -21,12 +21,12 @@ type RelationCreationPayloadAndObjectMetadata = { type ValidateMorphRelationCreationPayloadUtilArgs = { morphRelationCreationPayload: RelationCreationPayload[]; existingFlatObjectMetadataMaps: FlatEntityMaps; - objectMetadataId: string; + objectMetadataUniversalIdentifier: string; }; export const validateMorphRelationCreationPayload = async ({ existingFlatObjectMetadataMaps, morphRelationCreationPayload, - objectMetadataId, + objectMetadataUniversalIdentifier, }: ValidateMorphRelationCreationPayloadUtilArgs): Promise< FieldInputTranspilationResult > => { @@ -72,7 +72,9 @@ export const validateMorphRelationCreationPayload = async ({ ...new Set(allRelatedObjectMetadataIds), ]; - if (allRelatedObjectMetadataIdsSet.includes(objectMetadataId)) { + if ( + allRelatedObjectMetadataIdsSet.includes(objectMetadataUniversalIdentifier) + ) { return { status: 'fail', errors: [ diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-relation-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-relation-flat-field-metadata.util.ts index 48bc160f11..7076dd8a89 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-relation-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-relation-flat-field-metadata.util.ts @@ -3,7 +3,7 @@ import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { type FlatFieldMetadataTypeValidationArgs } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-type-validator.type'; import { type FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type'; import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; @@ -13,32 +13,33 @@ export const validateMorphRelationFlatFieldMetadata = ( args: FlatFieldMetadataTypeValidationArgs, ): FlatFieldMetadataValidationError[] => { const { - flatEntityToValidate: flatFieldMetadataToValidate, + flatEntityToValidate: universalFlatFieldMetadataToValidate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatFieldMetadataMaps }, remainingFlatEntityMapsToValidate, } = args; - const { relationTargetFieldMetadataId } = flatFieldMetadataToValidate; + const { relationTargetFieldMetadataUniversalIdentifier } = + universalFlatFieldMetadataToValidate; const errors: FlatFieldMetadataValidationError[] = []; errors.push(...validateMorphOrRelationFlatFieldMetadata(args)); - const targetFlatFieldMetadata = + const targetUniversalFlatFieldMetadata = (remainingFlatEntityMapsToValidate - ? findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: relationTargetFieldMetadataId, + ? findFlatEntityByUniversalIdentifier({ + universalIdentifier: relationTargetFieldMetadataUniversalIdentifier, flatEntityMaps: remainingFlatEntityMapsToValidate, }) : undefined) ?? - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: relationTargetFieldMetadataId, + findFlatEntityByUniversalIdentifier({ + universalIdentifier: relationTargetFieldMetadataUniversalIdentifier, flatEntityMaps: flatFieldMetadataMaps, }); if ( - isDefined(targetFlatFieldMetadata) && + isDefined(targetUniversalFlatFieldMetadata) && !isFlatFieldMetadataOfType( - targetFlatFieldMetadata, + targetUniversalFlatFieldMetadata, FieldMetadataType.RELATION, ) ) { @@ -49,11 +50,15 @@ export const validateMorphRelationFlatFieldMetadata = ( }); } - const sourceObjectMetadataId = flatFieldMetadataToValidate.objectMetadataId; - const targetObjectMetadataId = - flatFieldMetadataToValidate.relationTargetObjectMetadataId; + const sourceObjectMetadataUniversalIdentifier = + universalFlatFieldMetadataToValidate.objectMetadataUniversalIdentifier; + const targetObjectMetadataUniversalIdentifier = + universalFlatFieldMetadataToValidate.relationTargetObjectMetadataUniversalIdentifier; - if (sourceObjectMetadataId === targetObjectMetadataId) { + if ( + sourceObjectMetadataUniversalIdentifier === + targetObjectMetadataUniversalIdentifier + ) { errors.push({ code: FieldMetadataExceptionCode.INVALID_FIELD_INPUT, message: 'Source object cannot be the target object', @@ -61,7 +66,7 @@ export const validateMorphRelationFlatFieldMetadata = ( }); } - if (!isDefined(flatFieldMetadataToValidate.morphId)) { + if (!isDefined(universalFlatFieldMetadataToValidate.morphId)) { errors.push({ code: FieldMetadataExceptionCode.INVALID_FIELD_INPUT, message: 'Morph relation field must have a morph id', diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-front-component/constants/flat-front-component-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-front-component/constants/flat-front-component-editable-properties.constant.ts index 879af71aaa..c7ad99815d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-front-component/constants/flat-front-component-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-front-component/constants/flat-front-component-editable-properties.constant.ts @@ -1,4 +1,4 @@ -import { type FlatFrontComponent } from 'src/engine/metadata-modules/flat-front-component/types/flat-front-component.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_FRONT_COMPONENT_EDITABLE_PROPERTIES = [ 'name', @@ -7,4 +7,4 @@ export const FLAT_FRONT_COMPONENT_EDITABLE_PROPERTIES = [ 'sourceComponentPath', 'builtComponentPath', 'componentName', -] as const satisfies (keyof FlatFrontComponent)[]; +] as const satisfies MetadataEntityPropertyName<'frontComponent'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/__mocks__/get-flat-index-metadata.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/__mocks__/get-flat-index-metadata.mock.ts index 4bb935fe77..edb83567cc 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/__mocks__/get-flat-index-metadata.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/__mocks__/get-flat-index-metadata.mock.ts @@ -19,6 +19,7 @@ export const getFlatIndexMetadataMock = ( const createdAt = faker.date.anytime().toISOString(); return { + universalFlatIndexFieldMetadatas: [], flatIndexFieldMetadatas: [], createdAt, id: faker.string.uuid(), diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/services/workspace-flat-index-map-cache.service.ts b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/services/workspace-flat-index-map-cache.service.ts index ea62711667..2d0fe4c552 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/services/workspace-flat-index-map-cache.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/services/workspace-flat-index-map-cache.service.ts @@ -6,6 +6,7 @@ import { Repository } from 'typeorm'; import { WorkspaceCacheProvider } from 'src/engine/workspace-cache/interfaces/workspace-cache-provider.service'; import { ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; +import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant'; import { FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; @@ -28,6 +29,8 @@ export class WorkspaceFlatIndexMapCacheService extends WorkspaceCacheProvider< private readonly applicationRepository: Repository, @InjectRepository(ObjectMetadataEntity) private readonly objectMetadataRepository: Repository, + @InjectRepository(FieldMetadataEntity) + private readonly fieldMetadataRepository: Repository, ) { super(); } @@ -35,34 +38,42 @@ export class WorkspaceFlatIndexMapCacheService extends WorkspaceCacheProvider< async computeForCache( workspaceId: string, ): Promise> { - const [indexes, applications, objectMetadatas] = await Promise.all([ - this.indexMetadataRepository.find({ - where: { - workspaceId, - }, - withDeleted: true, - relationLoadStrategy: 'join', - select: { - // Note: We need all IndexFieldMetadataEntity in order to build a FlatIndex - indexFieldMetadatas: true, - }, - relations: ['indexFieldMetadatas'], - }), - this.applicationRepository.find({ - where: { workspaceId }, - select: ['id', 'universalIdentifier'], - }), - this.objectMetadataRepository.find({ - where: { workspaceId }, - select: ['id', 'universalIdentifier'], - withDeleted: true, - }), - ]); + const [indexes, applications, objectMetadatas, fieldMetadatas] = + await Promise.all([ + this.indexMetadataRepository.find({ + where: { + workspaceId, + }, + withDeleted: true, + relationLoadStrategy: 'join', + select: { + // Note: We need all IndexFieldMetadataEntity in order to build a FlatIndex + indexFieldMetadatas: true, + }, + relations: ['indexFieldMetadatas'], + }), + this.applicationRepository.find({ + where: { workspaceId }, + select: ['id', 'universalIdentifier'], + }), + this.objectMetadataRepository.find({ + where: { workspaceId }, + select: ['id', 'universalIdentifier'], + withDeleted: true, + }), + this.fieldMetadataRepository.find({ + where: { workspaceId }, + select: ['id', 'universalIdentifier'], + withDeleted: true, + }), + ]); const applicationIdToUniversalIdentifierMap = createIdToUniversalIdentifierMap(applications); const objectMetadataIdToUniversalIdentifierMap = createIdToUniversalIdentifierMap(objectMetadatas); + const fieldMetadataIdToUniversalIdentifierMap = + createIdToUniversalIdentifierMap(fieldMetadatas); const flatIndexMaps = createEmptyFlatEntityMaps(); @@ -71,6 +82,7 @@ export class WorkspaceFlatIndexMapCacheService extends WorkspaceCacheProvider< entity: indexEntity, applicationIdToUniversalIdentifierMap, objectMetadataIdToUniversalIdentifierMap, + fieldMetadataIdToUniversalIdentifierMap, }); addFlatEntityToFlatEntityMapsThroughMutationOrThrow({ diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type.ts index b4ad77111a..31944a93b9 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type.ts @@ -1,10 +1,10 @@ import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type'; import { type IndexFieldMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-field-metadata.entity'; import { type IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; export type FlatIndexFieldMetadata = FlatEntityFrom; export type FlatIndexMetadata = FlatEntityFrom & { - universalIdentifier: string; flatIndexFieldMetadatas: FlatIndexFieldMetadata[]; -}; +} & Pick; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/utils/from-index-metadata-entity-to-flat-index-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/utils/from-index-metadata-entity-to-flat-index-metadata.util.ts index f09ee2a3c5..5208225a00 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/utils/from-index-metadata-entity-to-flat-index-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/utils/from-index-metadata-entity-to-flat-index-metadata.util.ts @@ -12,7 +12,10 @@ export const fromIndexMetadataEntityToFlatIndexMetadata = ({ entity: indexMetadataEntity, applicationIdToUniversalIdentifierMap, objectMetadataIdToUniversalIdentifierMap, -}: FromEntityToFlatEntityArgs<'index'>): FlatIndexMetadata => { + fieldMetadataIdToUniversalIdentifierMap, +}: FromEntityToFlatEntityArgs<'index'> & { + fieldMetadataIdToUniversalIdentifierMap: Map; +}): FlatIndexMetadata => { const applicationUniversalIdentifier = applicationIdToUniversalIdentifierMap.get( indexMetadataEntity.applicationId, @@ -58,6 +61,29 @@ export const fromIndexMetadataEntityToFlatIndexMetadata = ({ updatedAt: indexFieldMetadata.updatedAt.toISOString(), }), ), + universalFlatIndexFieldMetadatas: + indexMetadataEntity.indexFieldMetadatas.map((indexFieldMetadata) => { + const fieldMetadataUniversalIdentifier = + fieldMetadataIdToUniversalIdentifierMap.get( + indexFieldMetadata.fieldMetadataId, + ); + + if (!isDefined(fieldMetadataUniversalIdentifier)) { + throw new FlatEntityMapsException( + `FieldMetadata with id ${indexFieldMetadata.fieldMetadataId} not found for index field metadata ${indexFieldMetadata.id}`, + FlatEntityMapsExceptionCode.RELATION_UNIVERSAL_IDENTIFIER_NOT_FOUND, + ); + } + + return { + order: indexFieldMetadata.order, + createdAt: indexFieldMetadata.createdAt.toISOString(), + updatedAt: indexFieldMetadata.updatedAt.toISOString(), + indexMetadataUniversalIdentifier: + indexMetadataEntity.universalIdentifier, + fieldMetadataUniversalIdentifier, + }; + }), applicationUniversalIdentifier, objectMetadataUniversalIdentifier, }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/constants/flat-navigation-menu-item-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/constants/flat-navigation-menu-item-editable-properties.constant.ts index 30182afaa0..db02044c1c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/constants/flat-navigation-menu-item-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/constants/flat-navigation-menu-item-editable-properties.constant.ts @@ -1,7 +1,7 @@ -import { type FlatNavigationMenuItem } from 'src/engine/metadata-modules/flat-navigation-menu-item/types/flat-navigation-menu-item.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_NAVIGATION_MENU_ITEM_EDITABLE_PROPERTIES = [ 'position', 'folderId', 'name', -] as const satisfies (keyof FlatNavigationMenuItem)[]; +] as const satisfies MetadataEntityPropertyName<'navigationMenuItem'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/constants/flat-object-metadata-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/constants/flat-object-metadata-editable-properties.constant.ts index 2cac35dcc7..1af8569427 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/constants/flat-object-metadata-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/constants/flat-object-metadata-editable-properties.constant.ts @@ -1,4 +1,4 @@ -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_OBJECT_METADATA_EDITABLE_PROPERTIES = { custom: [ @@ -15,5 +15,5 @@ export const FLAT_OBJECT_METADATA_EDITABLE_PROPERTIES = { standard: ['description', 'icon', 'isActive', 'labelPlural', 'labelSingular'], } as const satisfies Record< 'standard' | 'custom', - (keyof FlatObjectMetadata)[] + MetadataEntityPropertyName<'objectMetadata'>[] >; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/__tests__/get-morph-name-from-morph-field-metadata-name.util.spec.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/__tests__/get-morph-name-from-morph-field-metadata-name.util.spec.ts index e9b632f120..1afa0f0a2c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/__tests__/get-morph-name-from-morph-field-metadata-name.util.spec.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/__tests__/get-morph-name-from-morph-field-metadata-name.util.spec.ts @@ -1,7 +1,7 @@ import { FieldMetadataType, RelationType } from 'twenty-shared/types'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { getMorphNameFromMorphFieldMetadataName } from 'src/engine/metadata-modules/flat-object-metadata/utils/get-morph-name-from-morph-field-metadata-name.util'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; describe('getMorphNameFromMorphFieldMetadataName', () => { const createMorphRelationFlatFieldMetadataMock = ( @@ -12,8 +12,8 @@ describe('getMorphNameFromMorphFieldMetadataName', () => { name, type: FieldMetadataType.MORPH_RELATION, label: name, - settings: { relationType }, - }) as unknown as FlatFieldMetadata; + universalSettings: { relationType }, + }) as unknown as UniversalFlatFieldMetadata; it('should extract base morph field name for MANY_TO_ONE (removes singular suffix)', () => { const morphRelationFlatFieldMetadata = diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/are-flat-object-metadata-names-synced-with-labels.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/are-flat-object-metadata-names-synced-with-labels.util.ts index 1785eeceef..a6b2513f84 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/are-flat-object-metadata-names-synced-with-labels.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/are-flat-object-metadata-names-synced-with-labels.util.ts @@ -1,6 +1,6 @@ import { computeMetadataNameFromLabel } from 'twenty-shared/metadata'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; export const areFlatObjectMetadataNamesSyncedWithLabels = ({ flatObjectdMetadata, @@ -8,7 +8,7 @@ export const areFlatObjectMetadataNamesSyncedWithLabels = ({ }: { isSystemBuild: boolean; flatObjectdMetadata: Pick< - FlatObjectMetadata, + UniversalFlatObjectMetadata, 'namePlural' | 'nameSingular' | 'labelPlural' | 'labelSingular' >; }) => { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-create-object-input-to-flat-object-metadata-and-flat-field-metadatas-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-create-object-input-to-flat-object-metadata-and-flat-field-metadatas-to-create.util.ts index 14351276c3..f6ce5120dd 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-create-object-input-to-flat-object-metadata-and-flat-field-metadatas-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-create-object-input-to-flat-object-metadata-and-flat-field-metadatas-to-create.util.ts @@ -8,33 +8,31 @@ import { type FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interf import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { type CreateObjectInput } from 'src/engine/metadata-modules/object-metadata/dtos/create-object.input'; import { buildDefaultFlatFieldMetadatasForCustomObject } from 'src/engine/metadata-modules/object-metadata/utils/build-default-flat-field-metadatas-for-custom-object.util'; import { buildDefaultIndexesForCustomObject } from 'src/engine/metadata-modules/object-metadata/utils/build-default-index-for-custom-object.util'; import { buildDefaultRelationFlatFieldMetadatasForCustomObject } from 'src/engine/metadata-modules/object-metadata/utils/build-default-relation-flat-field-metadatas-for-custom-object.util'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; type FromCreateObjectInputToFlatObjectMetadataAndFlatFieldMetadatasToCreateArgs = { createObjectInput: CreateObjectInput; - workspaceId: string; flatApplication: FlatApplication; existingFeatureFlagsMap: FeatureFlagMap; } & Pick; export const fromCreateObjectInputToFlatObjectMetadataAndFlatFieldMetadatasToCreate = ({ createObjectInput: rawCreateObjectInput, - workspaceId, flatApplication, flatObjectMetadataMaps: existingFlatObjectMetadataMaps, existingFeatureFlagsMap, }: FromCreateObjectInputToFlatObjectMetadataAndFlatFieldMetadatasToCreateArgs): { - flatObjectMetadataToCreate: FlatObjectMetadata; - relationTargetFlatFieldMetadataToCreate: FlatFieldMetadata[]; - flatFieldMetadataToCreateOnObject: FlatFieldMetadata[]; - flatIndexMetadataToCreate: FlatIndexMetadata[]; + flatObjectMetadataToCreate: UniversalFlatObjectMetadata & { id: string }; + relationTargetFlatFieldMetadataToCreate: UniversalFlatFieldMetadata[]; + flatFieldMetadataToCreateOnObject: UniversalFlatFieldMetadata[]; + flatIndexMetadataToCreate: UniversalFlatIndexMetadata[]; } => { const createObjectInput = trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( @@ -55,35 +53,29 @@ export const fromCreateObjectInputToFlatObjectMetadataAndFlatFieldMetadatasToCre const defaultFlatFieldForCustomObjectMaps = buildDefaultFlatFieldMetadatasForCustomObject({ flatObjectMetadata: { - id: objectMetadataId, - applicationId: flatApplication.id, applicationUniversalIdentifier: flatApplication.universalIdentifier, universalIdentifier, }, - workspaceId, skipNameField: createObjectInput.skipNameField, }); const createdAt = new Date().toISOString(); // Use nameField.id if it exists, otherwise use idField.id (for junction tables without name) const nameField = defaultFlatFieldForCustomObjectMaps.fields.nameField; - const labelIdentifierFieldMetadataId = - nameField?.id ?? defaultFlatFieldForCustomObjectMaps.fields.idField.id; const labelIdentifierFieldMetadataUniversalIdentifier = nameField?.universalIdentifier ?? defaultFlatFieldForCustomObjectMaps.fields.idField.universalIdentifier; - const flatObjectMetadataToCreate: FlatObjectMetadata = { - fieldIds: [], - viewIds: [], - indexMetadataIds: [], + const universalFlatObjectMetadataToCreate: UniversalFlatObjectMetadata & { + id: string; + } = { + id: objectMetadataId, + universalIdentifier, createdAt, updatedAt: createdAt, duplicateCriteria: null, description: createObjectInput.description ?? null, icon: createObjectInput.icon ?? null, - id: objectMetadataId, - imageIdentifierFieldMetadataId: null, isActive: true, isAuditLogged: true, isCustom: true, @@ -92,17 +84,13 @@ export const fromCreateObjectInputToFlatObjectMetadataAndFlatFieldMetadatasToCre isSearchable: true, isUIReadOnly: false, isSystem: false, - labelIdentifierFieldMetadataId, labelPlural: capitalize(createObjectInput.labelPlural), labelSingular: capitalize(createObjectInput.labelSingular), namePlural: createObjectInput.namePlural, nameSingular: createObjectInput.nameSingular, shortcut: createObjectInput.shortcut ?? null, standardOverrides: null, - applicationId: flatApplication.id, - universalIdentifier, targetTableName: 'DEPRECATED', - workspaceId, applicationUniversalIdentifier: flatApplication.universalIdentifier, fieldUniversalIdentifiers: [], viewUniversalIdentifiers: [], @@ -116,13 +104,12 @@ export const fromCreateObjectInputToFlatObjectMetadataAndFlatFieldMetadatasToCre standardTargetFlatFieldMetadatas, } = buildDefaultRelationFlatFieldMetadatasForCustomObject({ existingFlatObjectMetadataMaps, - sourceFlatObjectMetadata: flatObjectMetadataToCreate, - workspaceId, + sourceFlatObjectMetadata: universalFlatObjectMetadataToCreate, flatApplication, existingFeatureFlagsMap, }); - const objectFlatFieldMetadatas: FlatFieldMetadata[] = [ + const objectFlatFieldMetadatas: UniversalFlatFieldMetadata[] = [ ...Object.values(defaultFlatFieldForCustomObjectMaps.fields), ...standardSourceFlatFieldMetadatas, ]; @@ -130,12 +117,11 @@ export const fromCreateObjectInputToFlatObjectMetadataAndFlatFieldMetadatasToCre const defaultIndexesForCustomObject = buildDefaultIndexesForCustomObject({ objectFlatFieldMetadatas, defaultFlatFieldForCustomObjectMaps, - flatObjectMetadata: flatObjectMetadataToCreate, - workspaceId, + flatObjectMetadata: universalFlatObjectMetadataToCreate, }); return { - flatObjectMetadataToCreate, + flatObjectMetadataToCreate: universalFlatObjectMetadataToCreate, flatIndexMetadataToCreate: Object.values( defaultIndexesForCustomObject.indexes, ), diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-delete-object-input-to-flat-field-metadatas-to-delete.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-delete-object-input-to-flat-field-metadatas-to-delete.util.ts index a38f85707d..4052b62c2d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-delete-object-input-to-flat-field-metadatas-to-delete.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-delete-object-input-to-flat-field-metadatas-to-delete.util.ts @@ -6,16 +6,16 @@ import { import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow } from 'src/engine/metadata-modules/flat-field-metadata/utils/find-relation-flat-field-metadatas-target-flat-field-metadata-or-throw.util'; import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { type DeleteOneObjectInput } from 'src/engine/metadata-modules/object-metadata/dtos/delete-object.input'; import { ObjectMetadataException, ObjectMetadataExceptionCode, } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; type FromDeleteObjectInputToFlatFieldMetadatasToDeleteArgs = { deleteObjectInput: DeleteOneObjectInput; @@ -30,8 +30,8 @@ export const fromDeleteObjectInputToFlatFieldMetadatasToDelete = ({ flatIndexMaps, // This should return an AllFlatEntityMaps }: FromDeleteObjectInputToFlatFieldMetadatasToDeleteArgs): { - flatFieldMetadatasToDelete: FlatFieldMetadata[]; - flatObjectMetadataToDelete: FlatObjectMetadata; + flatFieldMetadatasToDelete: UniversalFlatFieldMetadata[]; + flatObjectMetadataToDelete: UniversalFlatObjectMetadata; flatIndexToDelete: FlatIndexMetadata[]; } => { const { id: objectMetadataToDeleteId } = diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-update-object-input-to-flat-object-metadata-and-related-flat-entities.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-update-object-input-to-flat-object-metadata-and-related-flat-entities.util.ts index c756f30ca6..8849cd7f6f 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-update-object-input-to-flat-object-metadata-and-related-flat-entities.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-update-object-input-to-flat-object-metadata-and-related-flat-entities.util.ts @@ -4,9 +4,9 @@ import { } from 'twenty-shared/utils'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; +import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { FLAT_OBJECT_METADATA_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-object-metadata/constants/flat-object-metadata-editable-properties.constant'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { type FlatObjectMetadataUpdateSideEffects, handleFlatObjectMetadataUpdateSideEffect, @@ -18,6 +18,7 @@ import { ObjectMetadataExceptionCode, } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; import { mergeUpdateInExistingRecord } from 'src/utils/merge-update-in-existing-record.util'; type FromUpdateObjectInputToFlatObjectMetadataArgs = { @@ -40,7 +41,7 @@ export const fromUpdateObjectInputToFlatObjectMetadataAndRelatedFlatEntities = flatViewFieldMaps, flatViewMaps, }: FromUpdateObjectInputToFlatObjectMetadataArgs): FlatObjectMetadataUpdateSideEffects & { - flatObjectMetadataToUpdate: FlatObjectMetadata; + flatObjectMetadataToUpdate: UniversalFlatObjectMetadata; } => { const { id: objectMetadataIdToUpdate } = trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( @@ -81,6 +82,19 @@ export const fromUpdateObjectInputToFlatObjectMetadataAndRelatedFlatEntities = standardOverrides, }; + if ( + isDefined(updatedEditableObjectProperties.labelIdentifierFieldMetadataId) + ) { + const flatFieldMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityMaps: flatFieldMetadataMaps, + flatEntityId: + updatedEditableObjectProperties.labelIdentifierFieldMetadataId, + }); + + toFlatObjectMetadata.labelIdentifierFieldMetadataUniversalIdentifier = + flatFieldMetadata?.universalIdentifier; + } + const { flatIndexMetadatasToUpdate, flatViewFieldsToCreate, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/get-morph-name-from-morph-field-metadata-name.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/get-morph-name-from-morph-field-metadata-name.util.ts index 8b2a8dce7c..8ac7e35373 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/get-morph-name-from-morph-field-metadata-name.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/get-morph-name-from-morph-field-metadata-name.util.ts @@ -1,8 +1,8 @@ import { type FieldMetadataType, RelationType } from 'twenty-shared/types'; import { capitalize } from 'twenty-shared/utils'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { searchAndReplaceLast } from 'src/engine/metadata-modules/flat-object-metadata/utils/search-and-replace-last.util'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; export const getMorphNameFromMorphFieldMetadataName = ({ morphRelationFlatFieldMetadata, @@ -10,14 +10,14 @@ export const getMorphNameFromMorphFieldMetadataName = ({ namePlural, }: { morphRelationFlatFieldMetadata: Pick< - FlatFieldMetadata, - 'name' | 'settings' + UniversalFlatFieldMetadata, + 'name' | 'universalSettings' >; nameSingular: string; namePlural: string; }): string => { const isManyToOneRelationType = - morphRelationFlatFieldMetadata.settings.relationType === + morphRelationFlatFieldMetadata.universalSettings.relationType === RelationType.MANY_TO_ONE; return searchAndReplaceLast({ diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/handle-flat-object-metadata-update-side-effect.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/handle-flat-object-metadata-update-side-effect.util.ts index 69ba469aed..ed15d533a2 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/handle-flat-object-metadata-update-side-effect.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/handle-flat-object-metadata-update-side-effect.util.ts @@ -3,20 +3,21 @@ import { isDefined } from 'twenty-shared/utils'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { recomputeIndexAfterFlatObjectMetadataSingularNameUpdate } from 'src/engine/metadata-modules/flat-object-metadata/utils/recompute-index-after-flat-object-metadata-singular-name-update.util'; import { recomputeSearchVectorFieldAfterLabelIdentifierUpdate } from 'src/engine/metadata-modules/flat-object-metadata/utils/recompute-search-vector-field-after-label-identifier-update.util'; import { recomputeViewFieldIdentifierAfterFlatObjectIdentifierUpdate } from 'src/engine/metadata-modules/flat-object-metadata/utils/recompute-view-field-identifier-after-flat-object-identifier-update.util'; import { renameRelatedMorphFieldOnObjectNamesUpdate } from 'src/engine/metadata-modules/flat-object-metadata/utils/rename-related-morph-field-on-object-names-update.util'; -import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; +import { type UniversalFlatViewField } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-field.type'; export type FlatObjectMetadataUpdateSideEffects = { - otherObjectFlatFieldMetadatasToUpdate: FlatFieldMetadata[]; - sameObjectFlatFieldMetadatasToUpdate: FlatFieldMetadata[]; - flatViewFieldsToUpdate: FlatViewField[]; - flatViewFieldsToCreate: FlatViewField[]; - flatIndexMetadatasToUpdate: FlatIndexMetadata[]; + otherObjectFlatFieldMetadatasToUpdate: UniversalFlatFieldMetadata[]; + sameObjectFlatFieldMetadatasToUpdate: UniversalFlatFieldMetadata[]; + flatViewFieldsToUpdate: UniversalFlatViewField[]; + flatViewFieldsToCreate: UniversalFlatViewField[]; + flatIndexMetadatasToUpdate: UniversalFlatIndexMetadata[]; }; type HandleFlatObjectMetadataUpdateSideEffectArgs = FromTo< @@ -88,16 +89,18 @@ export const handleFlatObjectMetadataUpdateSideEffect = ({ if ( toFlatObjectMetadata.isSearchable && - isDefined(toFlatObjectMetadata.labelIdentifierFieldMetadataId) && - fromFlatObjectMetadata.labelIdentifierFieldMetadataId !== - toFlatObjectMetadata.labelIdentifierFieldMetadataId + isDefined( + toFlatObjectMetadata.labelIdentifierFieldMetadataUniversalIdentifier, + ) && + fromFlatObjectMetadata.labelIdentifierFieldMetadataUniversalIdentifier !== + toFlatObjectMetadata.labelIdentifierFieldMetadataUniversalIdentifier ) { const updatedSearchVectorField = recomputeSearchVectorFieldAfterLabelIdentifierUpdate({ existingFlatObjectMetadata: fromFlatObjectMetadata, flatFieldMetadataMaps, - updatedLabelIdentifierFieldMetadataId: - toFlatObjectMetadata.labelIdentifierFieldMetadataId, + labelIdentifierFieldMetadataUniversalIdentifier: + toFlatObjectMetadata.labelIdentifierFieldMetadataUniversalIdentifier, }); if (isDefined(updatedSearchVectorField)) { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-index-after-flat-object-metadata-singular-name-update.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-index-after-flat-object-metadata-singular-name-update.util.ts index 2a9f964bd5..cce4774ff0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-index-after-flat-object-metadata-singular-name-update.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-index-after-flat-object-metadata-singular-name-update.util.ts @@ -1,8 +1,8 @@ import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; -import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; +import { findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-universal-identifier-in-universal-flat-entity-maps-or-throw.util'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { generateFlatIndexMetadataWithNameOrThrow } from 'src/engine/metadata-modules/index-metadata/utils/generate-flat-index.util'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; type RecomputeIndexAfterFlatObjectMetadataSingularNameUpdateArgs = { existingFlatObjectMetadata: FlatObjectMetadata; @@ -13,10 +13,11 @@ export const recomputeIndexAfterFlatObjectMetadataSingularNameUpdate = ({ flatIndexMaps, updatedSingularName, flatFieldMetadataMaps, -}: RecomputeIndexAfterFlatObjectMetadataSingularNameUpdateArgs): FlatIndexMetadata[] => { +}: RecomputeIndexAfterFlatObjectMetadataSingularNameUpdateArgs): UniversalFlatIndexMetadata[] => { const allRelatedFlatIndexMetadata = - findManyFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityIds: existingFlatObjectMetadata.indexMetadataIds, + findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow({ + universalIdentifiers: + existingFlatObjectMetadata.indexMetadataUniversalIdentifiers, flatEntityMaps: flatIndexMaps, }); @@ -30,18 +31,21 @@ export const recomputeIndexAfterFlatObjectMetadataSingularNameUpdate = ({ }; const objectFlatFieldMetadatas = - findManyFlatEntityByIdInFlatEntityMapsOrThrow({ + findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow({ flatEntityMaps: flatFieldMetadataMaps, - flatEntityIds: optimisticFlatObjectMetadata.fieldIds, + universalIdentifiers: + optimisticFlatObjectMetadata.fieldUniversalIdentifiers, }); - return allRelatedFlatIndexMetadata.map((flatIndex) => { - const newIndex = generateFlatIndexMetadataWithNameOrThrow({ - flatIndex, - flatObjectMetadata: optimisticFlatObjectMetadata, - objectFlatFieldMetadatas, - }); + return allRelatedFlatIndexMetadata.map( + (flatIndex) => { + const newIndex = generateFlatIndexMetadataWithNameOrThrow({ + flatIndex, + flatObjectMetadata: optimisticFlatObjectMetadata, + objectFlatFieldMetadatas, + }); - return newIndex; - }); + return newIndex; + }, + ); }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-search-vector-field-after-label-identifier-update.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-search-vector-field-after-label-identifier-update.util.ts index 75c5c353c7..eab03623a0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-search-vector-field-after-label-identifier-update.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-search-vector-field-after-label-identifier-update.util.ts @@ -2,7 +2,7 @@ import { type FieldMetadataType } from 'twenty-shared/types'; import { findOrThrow, isDefined } from 'twenty-shared/utils'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; @@ -16,13 +16,13 @@ import { type SearchableFieldType } from 'src/engine/workspace-manager/utils/is- type RecomputeSearchVectorFieldAfterLabelIdentifierUpdateArgs = { existingFlatObjectMetadata: FlatObjectMetadata; - updatedLabelIdentifierFieldMetadataId: string; + labelIdentifierFieldMetadataUniversalIdentifier: string; } & Pick; export const recomputeSearchVectorFieldAfterLabelIdentifierUpdate = ({ existingFlatObjectMetadata, flatFieldMetadataMaps, - updatedLabelIdentifierFieldMetadataId, + labelIdentifierFieldMetadataUniversalIdentifier, }: RecomputeSearchVectorFieldAfterLabelIdentifierUpdateArgs): | FlatFieldMetadata | undefined => { @@ -37,9 +37,9 @@ export const recomputeSearchVectorFieldAfterLabelIdentifierUpdate = ({ (field) => field.name === SEARCH_VECTOR_FIELD.name, ) as FlatFieldMetadata; - const newLabelIdentifierField = findFlatEntityByIdInFlatEntityMaps({ + const newLabelIdentifierField = findFlatEntityByUniversalIdentifier({ flatEntityMaps: flatFieldMetadataMaps, - flatEntityId: updatedLabelIdentifierFieldMetadataId, + universalIdentifier: labelIdentifierFieldMetadataUniversalIdentifier, }); if (!isDefined(newLabelIdentifierField)) { @@ -59,8 +59,8 @@ export const recomputeSearchVectorFieldAfterLabelIdentifierUpdate = ({ return { ...searchVectorField, - settings: { - ...searchVectorField.settings, + universalSettings: { + ...searchVectorField.universalSettings, asExpression: newAsExpression, generatedType: 'STORED', }, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/rename-related-morph-field-on-object-names-update.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/rename-related-morph-field-on-object-names-update.util.ts index 35d82c3685..43a06bb679 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/rename-related-morph-field-on-object-names-update.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/rename-related-morph-field-on-object-names-update.util.ts @@ -9,27 +9,27 @@ import { computeMorphOrRelationFieldJoinColumnName } from 'src/engine/metadata-m import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { findFieldRelatedIndexes } from 'src/engine/metadata-modules/flat-field-metadata/utils/find-field-related-index.util'; import { recomputeIndexOnFlatFieldMetadataNameUpdate } from 'src/engine/metadata-modules/flat-field-metadata/utils/recompute-index-on-flat-field-metadata-name-update.util'; -import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { getFlatObjectMetadataTargetMorphRelationFlatFieldMetadatasOrThrow } from 'src/engine/metadata-modules/flat-object-metadata/utils/get-flat-object-metadata-many-to-one-target-morph-relation-flat-field-metadatas-or-throw.util'; import { getMorphNameFromMorphFieldMetadataName } from 'src/engine/metadata-modules/flat-object-metadata/utils/get-morph-name-from-morph-field-metadata-name.util'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; type UpdateMorphFlatFieldNameArgs = FromTo< FlatObjectMetadata, 'relationTargetFlatObjectMetadata' > & { - fromMorphFlatFieldMetadata: FlatFieldMetadata; + fromMorphFlatFieldMetadata: UniversalFlatFieldMetadata; }; const updateMorphFlatFieldName = ({ fromMorphFlatFieldMetadata, fromRelationTargetFlatObjectMetadata, toRelationTargetFlatObjectMetadata, -}: UpdateMorphFlatFieldNameArgs): FlatFieldMetadata => { +}: UpdateMorphFlatFieldNameArgs): UniversalFlatFieldMetadata => { const isManyToOneRelationType = - fromMorphFlatFieldMetadata.settings.relationType === + fromMorphFlatFieldMetadata.universalSettings.relationType === RelationType.MANY_TO_ONE; const initialMorphRelationFieldName = getMorphNameFromMorphFieldMetadataName({ morphRelationFlatFieldMetadata: fromMorphFlatFieldMetadata, @@ -39,7 +39,7 @@ const updateMorphFlatFieldName = ({ const newMorphFieldName = computeMorphRelationFieldName({ fieldName: initialMorphRelationFieldName, - relationType: fromMorphFlatFieldMetadata.settings.relationType, + relationType: fromMorphFlatFieldMetadata.universalSettings.relationType, targetObjectMetadataNameSingular: toRelationTargetFlatObjectMetadata.nameSingular, targetObjectMetadataNamePlural: @@ -55,8 +55,8 @@ const updateMorphFlatFieldName = ({ return { ...fromMorphFlatFieldMetadata, name: newMorphFieldName, - settings: { - ...fromMorphFlatFieldMetadata.settings, + universalSettings: { + ...fromMorphFlatFieldMetadata.universalSettings, joinColumnName: newJoinColumnName, }, }; @@ -72,8 +72,8 @@ type RenameRelatedMorphFieldOnObjectNamesUpdateArgs = FromTo< >; type RenameRelatedMorphFieldOnObjectNamesUpdateReturnType = { - morphFlatFieldMetadatasToUpdate: FlatFieldMetadata[]; - morphRelatedFlatIndexesToUpdate: FlatIndexMetadata[]; + morphFlatFieldMetadatasToUpdate: UniversalFlatFieldMetadata[]; + morphRelatedFlatIndexesToUpdate: UniversalFlatIndexMetadata[]; }; export const renameRelatedMorphFieldOnObjectNamesUpdate = ({ fromFlatObjectMetadata, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-identifiers.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-identifiers.util.ts index ab0e2c3515..a23a1029b5 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-identifiers.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-identifiers.util.ts @@ -4,63 +4,69 @@ import { isLabelIdentifierFieldMetadataTypes, } from 'twenty-shared/utils'; -import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { type FlatObjectMetadataValidationError } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata-validation-error.type'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { ObjectMetadataExceptionCode } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; export const validateFlatObjectMetadataIdentifiers = ({ - flatObjectMetadata, - flatFieldMetadataMaps, + universalFlatObjectMetadata, + universalFlatFieldMetadataMaps, }: { - flatObjectMetadata: Pick< - FlatObjectMetadata, - 'labelIdentifierFieldMetadataId' | 'imageIdentifierFieldMetadataId' + universalFlatObjectMetadata: Pick< + UniversalFlatObjectMetadata, + | 'labelIdentifierFieldMetadataUniversalIdentifier' + | 'imageIdentifierFieldMetadataUniversalIdentifier' >; - flatFieldMetadataMaps: FlatEntityMaps; + universalFlatFieldMetadataMaps: UniversalFlatEntityMaps; }) => { const errors: FlatObjectMetadataValidationError[] = []; - const { labelIdentifierFieldMetadataId, imageIdentifierFieldMetadataId } = - flatObjectMetadata; + const { + labelIdentifierFieldMetadataUniversalIdentifier, + imageIdentifierFieldMetadataUniversalIdentifier, + } = universalFlatObjectMetadata; // TODO should not be nullable - if (isDefined(labelIdentifierFieldMetadataId)) { - const flatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: labelIdentifierFieldMetadataId, - flatEntityMaps: flatFieldMetadataMaps, + if (isDefined(labelIdentifierFieldMetadataUniversalIdentifier)) { + const universalFlatFieldMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: labelIdentifierFieldMetadataUniversalIdentifier, + flatEntityMaps: universalFlatFieldMetadataMaps, }); - if (!isDefined(flatFieldMetadata)) { + if (!isDefined(universalFlatFieldMetadata)) { errors.push({ code: ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT, message: - 'labelIdentifierFieldMetadataId validation failed: related field metadata not found', + 'labelIdentifierFieldMetadataUniversalIdentifier validation failed: related field metadata not found', userFriendlyMessage: msg`Field declared as label identifier not found`, }); - } else if (!isLabelIdentifierFieldMetadataTypes(flatFieldMetadata.type)) { + } else if ( + !isLabelIdentifierFieldMetadataTypes(universalFlatFieldMetadata.type) + ) { errors.push({ code: ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT, message: - 'labelIdentifierFieldMetadataId validation failed: field type not compatible', + 'labelIdentifierFieldMetadataUniversalIdentifier validation failed: field type not compatible', userFriendlyMessage: msg`Field cannot be used as label identifier`, }); } } - if (isDefined(imageIdentifierFieldMetadataId)) { - const relatedFlatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: imageIdentifierFieldMetadataId, - flatEntityMaps: flatFieldMetadataMaps, - }); + if (isDefined(imageIdentifierFieldMetadataUniversalIdentifier)) { + const relatedUniversalFlatFieldMetadata = + findFlatEntityByUniversalIdentifier({ + universalIdentifier: imageIdentifierFieldMetadataUniversalIdentifier, + flatEntityMaps: universalFlatFieldMetadataMaps, + }); - if (!isDefined(relatedFlatFieldMetadata)) { + if (!isDefined(relatedUniversalFlatFieldMetadata)) { errors.push({ code: ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT, message: - 'imageIdentifierFieldMetadataId validation failed: related field metadata not found', + 'imageIdentifierFieldMetadataUniversalIdentifier validation failed: related field metadata not found', userFriendlyMessage: msg`Field declared as image identifier not found`, }); } diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-label.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-label.util.ts index b796533661..dc6f168284 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-label.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-label.util.ts @@ -1,16 +1,16 @@ import { msg } from '@lingui/core/macro'; import { type FlatObjectMetadataValidationError } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata-validation-error.type'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { type ObjectMetadataMinimalInformation } from 'src/engine/metadata-modules/flat-object-metadata/types/object-metadata-minimal-information.type'; import { ObjectMetadataExceptionCode } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; import { IDENTIFIER_MAX_CHAR_LENGTH } from 'src/engine/metadata-modules/utils/constants/identifier-max-char-length.constants'; import { IDENTIFIER_MIN_CHAR_LENGTH } from 'src/engine/metadata-modules/utils/constants/identifier-min-char-length.constants'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; export const validateFlatObjectMetadataLabel = ({ labelPlural, labelSingular, -}: Pick & +}: Pick & ObjectMetadataMinimalInformation): FlatObjectMetadataValidationError[] => { const errors: FlatObjectMetadataValidationError[] = []; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-name-and-labels.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-name-and-labels.util.ts index 1006312413..e69b9f493a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-name-and-labels.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-name-and-labels.util.ts @@ -1,68 +1,72 @@ import { msg, t } from '@lingui/core/macro'; import { isDefined } from 'twenty-shared/utils'; -import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { type FlatObjectMetadataValidationError } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata-validation-error.type'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { areFlatObjectMetadataNamesSyncedWithLabels } from 'src/engine/metadata-modules/flat-object-metadata/utils/are-flat-object-metadata-names-synced-with-labels.util'; import { validateFlatObjectMetadataLabel } from 'src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-label.util'; import { validateFlatObjectMetadataNames } from 'src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-name.util'; import { ObjectMetadataExceptionCode } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-builder-options.type'; type ValidateNoOtherObjectWithSameNameExistsOrThrowsParams = { objectMetadataNameSingular: string; objectMetadataNamePlural: string; - existingObjectMetadataId?: string; - objectMetadataMaps: FlatEntityMaps; + existingObjectMetadataUniversalIdentifier?: string; + universalFlatObjectMetadataMaps: UniversalFlatEntityMaps; }; export const doesOtherObjectWithSameNameExists = ({ - objectMetadataMaps, + universalFlatObjectMetadataMaps, objectMetadataNamePlural, objectMetadataNameSingular, - existingObjectMetadataId, + existingObjectMetadataUniversalIdentifier, }: ValidateNoOtherObjectWithSameNameExistsOrThrowsParams) => - Object.values(objectMetadataMaps.byUniversalIdentifier) + Object.values(universalFlatObjectMetadataMaps.byUniversalIdentifier) .filter(isDefined) .some( - (objectMetadata) => - (objectMetadata.nameSingular === objectMetadataNameSingular || - objectMetadata.namePlural === objectMetadataNamePlural || - objectMetadata.nameSingular === objectMetadataNamePlural || - objectMetadata.namePlural === objectMetadataNameSingular) && - objectMetadata.id !== existingObjectMetadataId, + (universalFlatObjectMetadata) => + (universalFlatObjectMetadata.nameSingular === + objectMetadataNameSingular || + universalFlatObjectMetadata.namePlural === objectMetadataNamePlural || + universalFlatObjectMetadata.nameSingular === + objectMetadataNamePlural || + universalFlatObjectMetadata.namePlural === + objectMetadataNameSingular) && + universalFlatObjectMetadata.universalIdentifier !== + existingObjectMetadataUniversalIdentifier, ); export const validateFlatObjectMetadataNameAndLabels = ({ - optimisticFlatObjectMetadataMaps, - flatObjectMetadataToValidate, + optimisticUniversalFlatObjectMetadataMaps, + universalFlatObjectMetadataToValidate, buildOptions, }: { - flatObjectMetadataToValidate: FlatObjectMetadata; - optimisticFlatObjectMetadataMaps: FlatEntityMaps; + universalFlatObjectMetadataToValidate: UniversalFlatObjectMetadata; + optimisticUniversalFlatObjectMetadataMaps: UniversalFlatEntityMaps; buildOptions: WorkspaceMigrationBuilderOptions; }): FlatObjectMetadataValidationError[] => { const errors: FlatObjectMetadataValidationError[] = []; errors.push( ...validateFlatObjectMetadataNames({ - namePlural: flatObjectMetadataToValidate.namePlural, - nameSingular: flatObjectMetadataToValidate.nameSingular, + namePlural: universalFlatObjectMetadataToValidate.namePlural, + nameSingular: universalFlatObjectMetadataToValidate.nameSingular, }), ); errors.push( ...validateFlatObjectMetadataLabel({ - labelPlural: flatObjectMetadataToValidate.labelPlural, - labelSingular: flatObjectMetadataToValidate.labelSingular, + labelPlural: universalFlatObjectMetadataToValidate.labelPlural, + labelSingular: universalFlatObjectMetadataToValidate.labelSingular, }), ); if ( - flatObjectMetadataToValidate.isLabelSyncedWithName && + universalFlatObjectMetadataToValidate.isLabelSyncedWithName && !areFlatObjectMetadataNamesSyncedWithLabels({ - flatObjectdMetadata: flatObjectMetadataToValidate, + flatObjectdMetadata: universalFlatObjectMetadataToValidate, isSystemBuild: buildOptions.isSystemBuild, }) ) { @@ -75,10 +79,14 @@ export const validateFlatObjectMetadataNameAndLabels = ({ if ( doesOtherObjectWithSameNameExists({ - objectMetadataNamePlural: flatObjectMetadataToValidate.namePlural, - objectMetadataNameSingular: flatObjectMetadataToValidate.nameSingular, - objectMetadataMaps: optimisticFlatObjectMetadataMaps, - existingObjectMetadataId: flatObjectMetadataToValidate.id, + objectMetadataNamePlural: + universalFlatObjectMetadataToValidate.namePlural, + objectMetadataNameSingular: + universalFlatObjectMetadataToValidate.nameSingular, + universalFlatObjectMetadataMaps: + optimisticUniversalFlatObjectMetadataMaps, + existingObjectMetadataUniversalIdentifier: + universalFlatObjectMetadataToValidate.universalIdentifier, }) ) { errors.push({ diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-name.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-name.util.ts index b645e13b4b..0f30ecb26f 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-name.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-name.util.ts @@ -2,11 +2,11 @@ import { msg } from '@lingui/core/macro'; import { RESERVED_METADATA_NAME_KEYWORDS } from 'twenty-shared/metadata'; import { type FlatObjectMetadataValidationError } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata-validation-error.type'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { type ObjectMetadataMinimalInformation } from 'src/engine/metadata-modules/flat-object-metadata/types/object-metadata-minimal-information.type'; import { ObjectMetadataExceptionCode } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; import { IDENTIFIER_MAX_CHAR_LENGTH } from 'src/engine/metadata-modules/utils/constants/identifier-max-char-length.constants'; import { IDENTIFIER_MIN_CHAR_LENGTH } from 'src/engine/metadata-modules/utils/constants/identifier-min-char-length.constants'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; const STARTS_WITH_LOWER_CASE_AND_CONTAINS_ONLY_CAPS_AND_LOWER_LETTERS_AND_NUMBER_STRING_REGEX = /^[a-z][a-zA-Z0-9]*$/; @@ -14,7 +14,7 @@ const STARTS_WITH_LOWER_CASE_AND_CONTAINS_ONLY_CAPS_AND_LOWER_LETTERS_AND_NUMBER export const validateFlatObjectMetadataNames = ({ namePlural, nameSingular, -}: Pick & +}: Pick & ObjectMetadataMinimalInformation) => { const errors: FlatObjectMetadataValidationError[] = []; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-tab/constants/flat-page-layout-tab-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-tab/constants/flat-page-layout-tab-editable-properties.constant.ts index 5adda39e65..ad4769f164 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-tab/constants/flat-page-layout-tab-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-tab/constants/flat-page-layout-tab-editable-properties.constant.ts @@ -1,6 +1,6 @@ -import { type FlatPageLayoutTab } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_PAGE_LAYOUT_TAB_EDITABLE_PROPERTIES = [ 'title', 'position', -] as const satisfies (keyof FlatPageLayoutTab)[]; +] as const satisfies MetadataEntityPropertyName<'pageLayoutTab'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/constants/flat-page-layout-widget-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/constants/flat-page-layout-widget-editable-properties.constant.ts index ab30a3996b..7f9795aa5c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/constants/flat-page-layout-widget-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/constants/flat-page-layout-widget-editable-properties.constant.ts @@ -1,4 +1,4 @@ -import { type FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_PAGE_LAYOUT_WIDGET_EDITABLE_PROPERTIES = [ 'title', @@ -7,4 +7,4 @@ export const FLAT_PAGE_LAYOUT_WIDGET_EDITABLE_PROPERTIES = [ 'gridPosition', 'position', 'configuration', -] as const satisfies (keyof FlatPageLayoutWidget)[]; +] as const satisfies MetadataEntityPropertyName<'pageLayoutWidget'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/services/flat-page-layout-widget-type-validator.service.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/services/flat-page-layout-widget-type-validator.service.ts index ea8ef483f3..be2bc2ca0d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/services/flat-page-layout-widget-type-validator.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/services/flat-page-layout-widget-type-validator.service.ts @@ -3,7 +3,6 @@ import { Injectable } from '@nestjs/common'; import { msg } from '@lingui/core/macro'; import { isDefined } from 'twenty-shared/utils'; -import { FlatEntityUpdate } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type'; import { type FlatPageLayoutWidgetTypeValidatorForCreation, type FlatPageLayoutWidgetTypeValidatorForUpdate, @@ -20,19 +19,20 @@ import { validateStandaloneRichTextFlatPageLayoutWidgetForCreation } from 'src/e import { validateStandaloneRichTextFlatPageLayoutWidgetForUpdate } from 'src/engine/metadata-modules/flat-page-layout-widget/validators/utils/validate-standalone-rich-text-flat-page-layout-widget-for-update.util'; import { WidgetType } from 'src/engine/metadata-modules/page-layout-widget/enums/widget-type.enum'; import { PageLayoutWidgetExceptionCode } from 'src/engine/metadata-modules/page-layout-widget/exceptions/page-layout-widget.exception'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { UniversalFlatEntityUpdate } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-update.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; export type GenericValidateFlatPageLayoutWidgetTypeSpecificitiesArgs = - FlatEntityValidationArgs<'pageLayoutWidget'> & { - update?: FlatEntityUpdate<'pageLayoutWidget'>; + UniversalFlatEntityValidationArgs<'pageLayoutWidget'> & { + update?: UniversalFlatEntityUpdate<'pageLayoutWidget'>; }; export type ValidateFlatPageLayoutWidgetTypeSpecificitiesForCreationArgs = - FlatEntityValidationArgs<'pageLayoutWidget'>; + UniversalFlatEntityValidationArgs<'pageLayoutWidget'>; export type ValidateFlatPageLayoutWidgetTypeSpecificitiesForUpdateArgs = - FlatEntityValidationArgs<'pageLayoutWidget'> & { - update: FlatEntityUpdate<'pageLayoutWidget'>; + UniversalFlatEntityValidationArgs<'pageLayoutWidget'> & { + update: UniversalFlatEntityUpdate<'pageLayoutWidget'>; }; @Injectable() diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/services/workspace-flat-page-layout-widget-map-cache.service.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/services/workspace-flat-page-layout-widget-map-cache.service.ts index 0f99437907..eba3d7354a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/services/workspace-flat-page-layout-widget-map-cache.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/services/workspace-flat-page-layout-widget-map-cache.service.ts @@ -77,8 +77,9 @@ export class WorkspaceFlatPageLayoutWidgetMapCacheService extends WorkspaceCache createIdToUniversalIdentifierMap(pageLayoutTabs); const objectMetadataIdToUniversalIdentifierMap = createIdToUniversalIdentifierMap(objectMetadatas); - const fieldMetadataIdToUniversalIdentifierMap = - createIdToUniversalIdentifierMap(fieldMetadatas); + const fieldMetadataUniversalIdentifierById = Object.fromEntries( + createIdToUniversalIdentifierMap(fieldMetadatas), + ); const flatPageLayoutWidgetMaps = createEmptyFlatEntityMaps(); @@ -89,7 +90,7 @@ export class WorkspaceFlatPageLayoutWidgetMapCacheService extends WorkspaceCache applicationIdToUniversalIdentifierMap, pageLayoutTabIdToUniversalIdentifierMap, objectMetadataIdToUniversalIdentifierMap, - fieldMetadataIdToUniversalIdentifierMap, + fieldMetadataUniversalIdentifierById, }); addFlatEntityToFlatEntityMapsThroughMutationOrThrow({ diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget-maps.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget-maps.type.ts index f4026a30bf..86656cdbbb 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget-maps.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget-maps.type.ts @@ -1,6 +1,4 @@ import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { type FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type'; -export type FlatPageLayoutWidgetMaps = FlatEntityMaps< - Omit ->; +export type FlatPageLayoutWidgetMaps = FlatEntityMaps; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type.ts index 878a399d89..853fde7d41 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type.ts @@ -4,4 +4,4 @@ import { type WidgetConfigurationType } from 'src/engine/metadata-modules/page-l export type FlatPageLayoutWidget< T extends WidgetConfigurationType = WidgetConfigurationType, -> = Omit>, 'universalConfiguration'>; +> = FlatEntityFrom>; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-create-page-layout-widget-input-to-flat-page-layout-widget-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-create-page-layout-widget-input-to-flat-page-layout-widget-to-create.util.ts index f7c3fb7d38..310d6b5532 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-create-page-layout-widget-input-to-flat-page-layout-widget-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-create-page-layout-widget-input-to-flat-page-layout-widget-to-create.util.ts @@ -5,6 +5,7 @@ import { type FlatApplication } from 'src/engine/core-modules/application/types/ import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { resolveEntityRelationUniversalIdentifiers } from 'src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util'; import { type FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type'; +import { fromPageLayoutWidgetConfigurationToUniversalConfiguration } from 'src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-configuration-to-universal-configuration.util'; import { type CreatePageLayoutWidgetInput } from 'src/engine/metadata-modules/page-layout-widget/dtos/inputs/create-page-layout-widget.input'; import { validateWidgetConfigurationInput } from 'src/engine/metadata-modules/page-layout-widget/utils/validate-widget-configuration-input.util'; @@ -15,7 +16,7 @@ export type FromCreatePageLayoutWidgetInputToFlatPageLayoutWidgetToCreateArgs = flatApplication: FlatApplication; } & Pick< AllFlatEntityMaps, - 'flatPageLayoutTabMaps' | 'flatObjectMetadataMaps' + 'flatPageLayoutTabMaps' | 'flatObjectMetadataMaps' | 'flatFieldMetadataMaps' >; export const fromCreatePageLayoutWidgetInputToFlatPageLayoutWidgetToCreate = ({ @@ -24,6 +25,7 @@ export const fromCreatePageLayoutWidgetInputToFlatPageLayoutWidgetToCreate = ({ flatApplication, flatPageLayoutTabMaps, flatObjectMetadataMaps, + flatFieldMetadataMaps, }: FromCreatePageLayoutWidgetInputToFlatPageLayoutWidgetToCreateArgs): FlatPageLayoutWidget => { const { pageLayoutTabId, ...createPageLayoutWidgetInput } = trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( @@ -69,5 +71,12 @@ export const fromCreatePageLayoutWidgetInputToFlatPageLayoutWidgetToCreate = ({ applicationId: flatApplication.id, applicationUniversalIdentifier: flatApplication.universalIdentifier, conditionalDisplay: null, + universalConfiguration: + fromPageLayoutWidgetConfigurationToUniversalConfiguration({ + configuration: createPageLayoutWidgetInput.configuration, + fieldMetadataUniversalIdentifierById: + flatFieldMetadataMaps.universalIdentifierById, + shouldThrowOnMissingIdentifier: true, + }), }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-configuration-to-universal-configuration.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-configuration-to-universal-configuration.util.ts index 39a646c73b..2eeedc361b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-configuration-to-universal-configuration.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-configuration-to-universal-configuration.util.ts @@ -1,5 +1,9 @@ import { isDefined } from 'twenty-shared/utils'; +import { + FlatEntityMapsException, + FlatEntityMapsExceptionCode, +} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; import { type FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type'; import { type PageLayoutWidgetEntity } from 'src/engine/metadata-modules/page-layout-widget/entities/page-layout-widget.entity'; import { WidgetConfigurationType } from 'src/engine/metadata-modules/page-layout-widget/enums/widget-configuration-type.type'; @@ -7,62 +11,87 @@ import { WidgetConfigurationType } from 'src/engine/metadata-modules/page-layout type PageLayoutWidgetConfiguration = PageLayoutWidgetEntity['configuration']; type UniversalPageLayoutWidgetConfiguration = - // @ts-expect-error Ignoring until the pageLayoutWidget has been universally migrated NonNullable['universalConfiguration']; -// Field metadata IDs in widget configurations don't need to reference existing entities const getFieldMetadataUniversalIdentifier = ({ fieldMetadataId, - fieldMetadataIdToUniversalIdentifierMap, + fieldMetadataUniversalIdentifierById, + shouldThrowOnMissingIdentifier, }: { fieldMetadataId: string; - fieldMetadataIdToUniversalIdentifierMap: Map; + fieldMetadataUniversalIdentifierById: Partial>; + shouldThrowOnMissingIdentifier: boolean; }): string | null => { - return fieldMetadataIdToUniversalIdentifierMap.get(fieldMetadataId) ?? null; + const universalIdentifier = + fieldMetadataUniversalIdentifierById[fieldMetadataId]; + + if (!isDefined(universalIdentifier)) { + if (shouldThrowOnMissingIdentifier) { + throw new FlatEntityMapsException( + `Field metadata universal identifier not found for id: ${fieldMetadataId}`, + FlatEntityMapsExceptionCode.RELATION_UNIVERSAL_IDENTIFIER_NOT_FOUND, + ); + } + + return null; + } + + return universalIdentifier; }; export const fromPageLayoutWidgetConfigurationToUniversalConfiguration = ({ configuration, - fieldMetadataIdToUniversalIdentifierMap, + fieldMetadataUniversalIdentifierById, + shouldThrowOnMissingIdentifier = false, }: { configuration: PageLayoutWidgetConfiguration; - fieldMetadataIdToUniversalIdentifierMap: Map; + fieldMetadataUniversalIdentifierById: Partial>; + shouldThrowOnMissingIdentifier?: boolean; }): UniversalPageLayoutWidgetConfiguration => { switch (configuration.configurationType) { case WidgetConfigurationType.AGGREGATE_CHART: { const { aggregateFieldMetadataId, ratioAggregateConfig, ...rest } = configuration; - return { - ...rest, - aggregateFieldMetadataUniversalIdentifier: - getFieldMetadataUniversalIdentifier({ - fieldMetadataId: aggregateFieldMetadataId, - fieldMetadataIdToUniversalIdentifierMap, - }), - ...(isDefined(ratioAggregateConfig) && { - ratioAggregateConfig: { + const aggregateFieldMetadataUniversalIdentifier = + getFieldMetadataUniversalIdentifier({ + fieldMetadataId: aggregateFieldMetadataId, + fieldMetadataUniversalIdentifierById, + shouldThrowOnMissingIdentifier, + }); + + const universalRatioAggregateConfig = isDefined(ratioAggregateConfig) + ? { optionValue: ratioAggregateConfig.optionValue, fieldMetadataUniversalIdentifier: getFieldMetadataUniversalIdentifier({ fieldMetadataId: ratioAggregateConfig.fieldMetadataId, - fieldMetadataIdToUniversalIdentifierMap, + fieldMetadataUniversalIdentifierById, + shouldThrowOnMissingIdentifier, }), - }, - }), + } + : undefined; + + return { + ...rest, + aggregateFieldMetadataUniversalIdentifier, + ratioAggregateConfig: universalRatioAggregateConfig, }; } case WidgetConfigurationType.GAUGE_CHART: { const { aggregateFieldMetadataId, ...rest } = configuration; + const aggregateFieldMetadataUniversalIdentifier = + getFieldMetadataUniversalIdentifier({ + fieldMetadataId: aggregateFieldMetadataId, + fieldMetadataUniversalIdentifierById, + shouldThrowOnMissingIdentifier, + }); + return { ...rest, - aggregateFieldMetadataUniversalIdentifier: - getFieldMetadataUniversalIdentifier({ - fieldMetadataId: aggregateFieldMetadataId, - fieldMetadataIdToUniversalIdentifierMap, - }), + aggregateFieldMetadataUniversalIdentifier, }; } @@ -70,18 +99,24 @@ export const fromPageLayoutWidgetConfigurationToUniversalConfiguration = ({ const { aggregateFieldMetadataId, groupByFieldMetadataId, ...rest } = configuration; + const aggregateFieldMetadataUniversalIdentifier = + getFieldMetadataUniversalIdentifier({ + fieldMetadataId: aggregateFieldMetadataId, + fieldMetadataUniversalIdentifierById, + shouldThrowOnMissingIdentifier, + }); + + const groupByFieldMetadataUniversalIdentifier = + getFieldMetadataUniversalIdentifier({ + fieldMetadataId: groupByFieldMetadataId, + fieldMetadataUniversalIdentifierById, + shouldThrowOnMissingIdentifier, + }); + return { ...rest, - aggregateFieldMetadataUniversalIdentifier: - getFieldMetadataUniversalIdentifier({ - fieldMetadataId: aggregateFieldMetadataId, - fieldMetadataIdToUniversalIdentifierMap, - }), - groupByFieldMetadataUniversalIdentifier: - getFieldMetadataUniversalIdentifier({ - fieldMetadataId: groupByFieldMetadataId, - fieldMetadataIdToUniversalIdentifierMap, - }), + aggregateFieldMetadataUniversalIdentifier, + groupByFieldMetadataUniversalIdentifier, }; } @@ -93,25 +128,35 @@ export const fromPageLayoutWidgetConfigurationToUniversalConfiguration = ({ ...rest } = configuration; + const aggregateFieldMetadataUniversalIdentifier = + getFieldMetadataUniversalIdentifier({ + fieldMetadataId: aggregateFieldMetadataId, + fieldMetadataUniversalIdentifierById, + shouldThrowOnMissingIdentifier, + }); + + const primaryAxisGroupByFieldMetadataUniversalIdentifier = + getFieldMetadataUniversalIdentifier({ + fieldMetadataId: primaryAxisGroupByFieldMetadataId, + fieldMetadataUniversalIdentifierById, + shouldThrowOnMissingIdentifier, + }); + + const secondaryAxisGroupByFieldMetadataUniversalIdentifier = isDefined( + secondaryAxisGroupByFieldMetadataId, + ) + ? getFieldMetadataUniversalIdentifier({ + fieldMetadataId: secondaryAxisGroupByFieldMetadataId, + fieldMetadataUniversalIdentifierById, + shouldThrowOnMissingIdentifier, + }) + : undefined; + return { ...rest, - aggregateFieldMetadataUniversalIdentifier: - getFieldMetadataUniversalIdentifier({ - fieldMetadataId: aggregateFieldMetadataId, - fieldMetadataIdToUniversalIdentifierMap, - }), - primaryAxisGroupByFieldMetadataUniversalIdentifier: - getFieldMetadataUniversalIdentifier({ - fieldMetadataId: primaryAxisGroupByFieldMetadataId, - fieldMetadataIdToUniversalIdentifierMap, - }), - ...(isDefined(secondaryAxisGroupByFieldMetadataId) && { - secondaryAxisGroupByFieldMetadataUniversalIdentifier: - getFieldMetadataUniversalIdentifier({ - fieldMetadataId: secondaryAxisGroupByFieldMetadataId, - fieldMetadataIdToUniversalIdentifierMap, - }), - }), + aggregateFieldMetadataUniversalIdentifier, + primaryAxisGroupByFieldMetadataUniversalIdentifier, + secondaryAxisGroupByFieldMetadataUniversalIdentifier, }; } @@ -123,25 +168,35 @@ export const fromPageLayoutWidgetConfigurationToUniversalConfiguration = ({ ...rest } = configuration; + const aggregateFieldMetadataUniversalIdentifier = + getFieldMetadataUniversalIdentifier({ + fieldMetadataId: aggregateFieldMetadataId, + fieldMetadataUniversalIdentifierById, + shouldThrowOnMissingIdentifier, + }); + + const primaryAxisGroupByFieldMetadataUniversalIdentifier = + getFieldMetadataUniversalIdentifier({ + fieldMetadataId: primaryAxisGroupByFieldMetadataId, + fieldMetadataUniversalIdentifierById, + shouldThrowOnMissingIdentifier, + }); + + const secondaryAxisGroupByFieldMetadataUniversalIdentifier = isDefined( + secondaryAxisGroupByFieldMetadataId, + ) + ? getFieldMetadataUniversalIdentifier({ + fieldMetadataId: secondaryAxisGroupByFieldMetadataId, + fieldMetadataUniversalIdentifierById, + shouldThrowOnMissingIdentifier, + }) + : undefined; + return { ...rest, - aggregateFieldMetadataUniversalIdentifier: - getFieldMetadataUniversalIdentifier({ - fieldMetadataId: aggregateFieldMetadataId, - fieldMetadataIdToUniversalIdentifierMap, - }), - primaryAxisGroupByFieldMetadataUniversalIdentifier: - getFieldMetadataUniversalIdentifier({ - fieldMetadataId: primaryAxisGroupByFieldMetadataId, - fieldMetadataIdToUniversalIdentifierMap, - }), - ...(isDefined(secondaryAxisGroupByFieldMetadataId) && { - secondaryAxisGroupByFieldMetadataUniversalIdentifier: - getFieldMetadataUniversalIdentifier({ - fieldMetadataId: secondaryAxisGroupByFieldMetadataId, - fieldMetadataIdToUniversalIdentifierMap, - }), - }), + aggregateFieldMetadataUniversalIdentifier, + primaryAxisGroupByFieldMetadataUniversalIdentifier, + secondaryAxisGroupByFieldMetadataUniversalIdentifier, }; } diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-entity-to-flat-page-layout-widget.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-entity-to-flat-page-layout-widget.util.ts index 451eb62085..7836497aa6 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-entity-to-flat-page-layout-widget.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-entity-to-flat-page-layout-widget.util.ts @@ -6,11 +6,12 @@ import { } from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; import { getMetadataEntityRelationProperties } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-entity-relation-properties.util'; import { type FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type'; +import { fromPageLayoutWidgetConfigurationToUniversalConfiguration } from 'src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-configuration-to-universal-configuration.util'; import { type FromEntityToFlatEntityArgs } from 'src/engine/workspace-cache/types/from-entity-to-flat-entity-args.type'; type FromPageLayoutWidgetEntityToFlatPageLayoutWidgetArgs = FromEntityToFlatEntityArgs<'pageLayoutWidget'> & { - fieldMetadataIdToUniversalIdentifierMap: Map; + fieldMetadataUniversalIdentifierById: Partial>; }; export const fromPageLayoutWidgetEntityToFlatPageLayoutWidget = ({ @@ -18,6 +19,7 @@ export const fromPageLayoutWidgetEntityToFlatPageLayoutWidget = ({ applicationIdToUniversalIdentifierMap, pageLayoutTabIdToUniversalIdentifierMap, objectMetadataIdToUniversalIdentifierMap, + fieldMetadataUniversalIdentifierById, }: FromPageLayoutWidgetEntityToFlatPageLayoutWidgetArgs): FlatPageLayoutWidget => { const pageLayoutWidgetEntityWithoutRelations = removePropertiesFromRecord( pageLayoutWidgetEntity, @@ -64,12 +66,11 @@ export const fromPageLayoutWidgetEntityToFlatPageLayoutWidget = ({ } } - // TODO uncomment once page layout widget has been migrated - // const configurationWithUniversalIdentifiers = - // fromPageLayoutWidgetConfigurationToUniversalConfiguration({ - // configuration: pageLayoutWidgetEntityWithoutRelations.configuration, - // fieldMetadataIdToUniversalIdentifierMap, - // }); + const configurationWithUniversalIdentifiers = + fromPageLayoutWidgetConfigurationToUniversalConfiguration({ + configuration: pageLayoutWidgetEntityWithoutRelations.configuration, + fieldMetadataUniversalIdentifierById, + }); return { ...pageLayoutWidgetEntityWithoutRelations, @@ -82,6 +83,6 @@ export const fromPageLayoutWidgetEntityToFlatPageLayoutWidget = ({ applicationUniversalIdentifier, pageLayoutTabUniversalIdentifier, objectMetadataUniversalIdentifier, - // universalConfiguration: configurationWithUniversalIdentifiers, + universalConfiguration: configurationWithUniversalIdentifiers, }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-update-page-layout-widget-input-to-flat-page-layout-widget-to-update-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-update-page-layout-widget-input-to-flat-page-layout-widget-to-update-or-throw.util.ts index 3cfbf1cf15..e35d98435e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-update-page-layout-widget-input-to-flat-page-layout-widget-to-update-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-update-page-layout-widget-input-to-flat-page-layout-widget-to-update-or-throw.util.ts @@ -10,6 +10,7 @@ import { resolveEntityRelationUniversalIdentifiers } from 'src/engine/metadata-m import { FLAT_PAGE_LAYOUT_WIDGET_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-page-layout-widget/constants/flat-page-layout-widget-editable-properties.constant'; import { type FlatPageLayoutWidgetMaps } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget-maps.type'; import { type FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type'; +import { fromPageLayoutWidgetConfigurationToUniversalConfiguration } from 'src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-configuration-to-universal-configuration.util'; import { type UpdatePageLayoutWidgetInput } from 'src/engine/metadata-modules/page-layout-widget/dtos/inputs/update-page-layout-widget.input'; import { PageLayoutWidgetException, @@ -28,12 +29,13 @@ export const fromUpdatePageLayoutWidgetInputToFlatPageLayoutWidgetToUpdateOrThro updatePageLayoutWidgetInput: rawUpdatePageLayoutWidgetInput, flatPageLayoutWidgetMaps, flatObjectMetadataMaps, + flatFieldMetadataMaps, }: { updatePageLayoutWidgetInput: UpdatePageLayoutWidgetInputWithId; flatPageLayoutWidgetMaps: FlatPageLayoutWidgetMaps; } & Pick< AllFlatEntityMaps, - 'flatObjectMetadataMaps' + 'flatObjectMetadataMaps' | 'flatFieldMetadataMaps' >): FlatPageLayoutWidget => { const { id: pageLayoutWidgetToUpdateId } = extractAndSanitizeObjectStringFields(rawUpdatePageLayoutWidgetInput, [ @@ -89,5 +91,14 @@ export const fromUpdatePageLayoutWidgetInputToFlatPageLayoutWidgetToUpdateOrThro objectMetadataUniversalIdentifier; } + if (isDefined(updatedEditableFieldProperties.configuration)) { + flatPageLayoutWidgetToUpdate.universalConfiguration = + fromPageLayoutWidgetConfigurationToUniversalConfiguration({ + configuration: flatPageLayoutWidgetToUpdate.configuration, + fieldMetadataUniversalIdentifierById: + flatFieldMetadataMaps.universalIdentifierById, + }); + } + return flatPageLayoutWidgetToUpdate; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout/constants/flat-page-layout-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout/constants/flat-page-layout-editable-properties.constant.ts index 45303f1c5a..4f2f3c1208 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout/constants/flat-page-layout-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout/constants/flat-page-layout-editable-properties.constant.ts @@ -1,6 +1,7 @@ -import { type FlatPageLayout } from 'src/engine/metadata-modules/flat-page-layout/types/flat-page-layout.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; -export const FLAT_PAGE_LAYOUT_EDITABLE_PROPERTIES: (keyof Pick< - FlatPageLayout, - 'name' | 'type' | 'objectMetadataId' ->)[] = ['name', 'type', 'objectMetadataId']; +export const FLAT_PAGE_LAYOUT_EDITABLE_PROPERTIES = [ + 'name', + 'type', + 'objectMetadataId', +] as const satisfies MetadataEntityPropertyName<'pageLayout'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-role-target/constants/flat-role-target-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-role-target/constants/flat-role-target-editable-properties.constant.ts index d9a9ef0ab6..51002d5571 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-role-target/constants/flat-role-target-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-role-target/constants/flat-role-target-editable-properties.constant.ts @@ -1,7 +1,7 @@ +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; import { ROLE_TARGET_FOREIGN_KEY_PROPERTIES } from 'src/engine/metadata-modules/flat-role-target/constants/role-target-foreign-key-properties.constant'; -import { type FlatRoleTarget } from 'src/engine/metadata-modules/flat-role-target/types/flat-role-target.type'; export const FLAT_ROLE_TARGET_EDITABLE_PROPERTIES = [ 'roleId', ...ROLE_TARGET_FOREIGN_KEY_PROPERTIES, -] as const satisfies (keyof FlatRoleTarget)[]; +] as const satisfies MetadataEntityPropertyName<'roleTarget'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-role-target/constants/role-target-foreign-key-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-role-target/constants/role-target-foreign-key-properties.constant.ts index 744a18d890..2a98451e05 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-role-target/constants/role-target-foreign-key-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-role-target/constants/role-target-foreign-key-properties.constant.ts @@ -1,7 +1,7 @@ -import { type FlatRoleTarget } from 'src/engine/metadata-modules/flat-role-target/types/flat-role-target.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const ROLE_TARGET_FOREIGN_KEY_PROPERTIES = [ 'userWorkspaceId', 'apiKeyId', 'agentId', -] as const satisfies (keyof FlatRoleTarget)[]; +] as const satisfies MetadataEntityPropertyName<'roleTarget'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-role/constants/flat-role-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-role/constants/flat-role-editable-properties.constant.ts index 4338974bce..f040e41c94 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-role/constants/flat-role-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-role/constants/flat-role-editable-properties.constant.ts @@ -1,16 +1,17 @@ -import { type FlatRole } from 'src/engine/metadata-modules/flat-role/types/flat-role.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; -export const FLAT_ROLE_EDITABLE_PROPERTIES: (keyof FlatRole)[] = [ - 'label', - 'description', - 'icon', - 'canUpdateAllSettings', - 'canAccessAllTools', - 'canReadAllObjectRecords', - 'canUpdateAllObjectRecords', - 'canSoftDeleteAllObjectRecords', - 'canDestroyAllObjectRecords', - 'canBeAssignedToUsers', - 'canBeAssignedToAgents', - 'canBeAssignedToApiKeys', -]; +export const FLAT_ROLE_EDITABLE_PROPERTIES: MetadataEntityPropertyName<'role'>[] = + [ + 'label', + 'description', + 'icon', + 'canUpdateAllSettings', + 'canAccessAllTools', + 'canReadAllObjectRecords', + 'canUpdateAllObjectRecords', + 'canSoftDeleteAllObjectRecords', + 'canDestroyAllObjectRecords', + 'canBeAssignedToUsers', + 'canBeAssignedToAgents', + 'canBeAssignedToApiKeys', + ]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-row-level-permission-predicate/constants/flat-row-level-permission-predicate-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-row-level-permission-predicate/constants/flat-row-level-permission-predicate-editable-properties.constant.ts index 72b65c0ff6..8e23e962f1 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-row-level-permission-predicate/constants/flat-row-level-permission-predicate-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-row-level-permission-predicate/constants/flat-row-level-permission-predicate-editable-properties.constant.ts @@ -1,6 +1,6 @@ /* @license Enterprise */ -import { type FlatRowLevelPermissionPredicate } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_ROW_LEVEL_PERMISSION_PREDICATE_EDITABLE_PROPERTIES = [ 'fieldMetadataId', @@ -11,4 +11,4 @@ export const FLAT_ROW_LEVEL_PERMISSION_PREDICATE_EDITABLE_PROPERTIES = [ 'subFieldName', 'workspaceMemberFieldMetadataId', 'workspaceMemberSubFieldName', -] as const satisfies (keyof FlatRowLevelPermissionPredicate)[]; +] as const satisfies MetadataEntityPropertyName<'rowLevelPermissionPredicate'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-row-level-permission-predicate/constants/flat-row-level-permission-predicate-group-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-row-level-permission-predicate/constants/flat-row-level-permission-predicate-group-editable-properties.constant.ts index 314bf0c58f..e1dc3481fc 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-row-level-permission-predicate/constants/flat-row-level-permission-predicate-group-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-row-level-permission-predicate/constants/flat-row-level-permission-predicate-group-editable-properties.constant.ts @@ -1,9 +1,9 @@ /* @license Enterprise */ -import { type FlatRowLevelPermissionPredicateGroup } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-group.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_ROW_LEVEL_PERMISSION_PREDICATE_GROUP_EDITABLE_PROPERTIES = [ 'logicalOperator', 'positionInRowLevelPermissionPredicateGroup', 'parentRowLevelPermissionPredicateGroupId', -] as const satisfies (keyof FlatRowLevelPermissionPredicateGroup)[]; +] as const satisfies MetadataEntityPropertyName<'rowLevelPermissionPredicateGroup'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-skill/constants/flat-skill-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-skill/constants/flat-skill-editable-properties.constant.ts index a7dfdabb00..eab3909158 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-skill/constants/flat-skill-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-skill/constants/flat-skill-editable-properties.constant.ts @@ -1,4 +1,4 @@ -import { type FlatSkill } from 'src/engine/metadata-modules/flat-skill/types/flat-skill.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_SKILL_EDITABLE_PROPERTIES = [ 'name', @@ -7,4 +7,4 @@ export const FLAT_SKILL_EDITABLE_PROPERTIES = [ 'description', 'content', 'isActive', -] as const satisfies (keyof FlatSkill)[]; +] as const satisfies MetadataEntityPropertyName<'skill'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-skill/utils/from-create-skill-input-to-flat-skill-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-skill/utils/from-create-skill-input-to-flat-skill-to-create.util.ts index 1541062a83..3177c28ab9 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-skill/utils/from-create-skill-input-to-flat-skill-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-skill/utils/from-create-skill-input-to-flat-skill-to-create.util.ts @@ -2,18 +2,16 @@ import { trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties } from 'tw import { v4 } from 'uuid'; import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; -import { type FlatSkill } from 'src/engine/metadata-modules/flat-skill/types/flat-skill.type'; import { type CreateSkillInput } from 'src/engine/metadata-modules/skill/dtos/create-skill.input'; +import { type UniversalFlatSkill } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-skill.type'; -export const fromCreateSkillInputToFlatSkillToCreate = ({ +export const fromCreateSkillInputToUniversalFlatSkillToCreate = ({ createSkillInput, - workspaceId, flatApplication, }: { createSkillInput: CreateSkillInput; - workspaceId: string; flatApplication: FlatApplication; -}): FlatSkill => { +}): UniversalFlatSkill & { id: string } => { const now = new Date().toISOString(); const { name, label, icon, description } = @@ -29,6 +27,7 @@ export const fromCreateSkillInputToFlatSkillToCreate = ({ return { id, + universalIdentifier: v4(), name, label, icon: icon ?? null, @@ -36,11 +35,8 @@ export const fromCreateSkillInputToFlatSkillToCreate = ({ content, isCustom: true, isActive: true, - workspaceId, createdAt: now, updatedAt: now, - universalIdentifier: id, - applicationId: flatApplication.id, applicationUniversalIdentifier: flatApplication.universalIdentifier, }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/constants/flat-view-field-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/constants/flat-view-field-editable-properties.constant.ts index f48cff0323..c44b72b715 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/constants/flat-view-field-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/constants/flat-view-field-editable-properties.constant.ts @@ -1,8 +1,8 @@ -import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_VIEW_FIELD_EDITABLE_PROPERTIES = [ 'isVisible', 'size', 'position', 'aggregateOperation', -] as const satisfies (keyof FlatViewField)[]; +] as const satisfies MetadataEntityPropertyName<'viewField'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-create-view-field-input-to-flat-view-field-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-create-view-field-input-to-flat-view-field-to-create.util.ts index 4c8130b407..fb19a1b9aa 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-create-view-field-input-to-flat-view-field-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-create-view-field-input-to-flat-view-field-to-create.util.ts @@ -5,22 +5,22 @@ import { type FlatApplication } from 'src/engine/core-modules/application/types/ import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { resolveEntityRelationUniversalIdentifiers } from 'src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util'; import { DEFAULT_VIEW_FIELD_SIZE } from 'src/engine/metadata-modules/flat-view-field/constants/default-view-field-size.constant'; -import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type'; import { type CreateViewFieldInput } from 'src/engine/metadata-modules/view-field/dtos/inputs/create-view-field.input'; +import { type UniversalFlatViewField } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-field.type'; export type FromCreateViewFieldInputToFlatViewFieldToCreateArgs = { createViewFieldInput: CreateViewFieldInput; - workspaceId: string; flatApplication: FlatApplication; } & Pick; export const fromCreateViewFieldInputToFlatViewFieldToCreate = ({ createViewFieldInput: rawCreateViewFieldInput, - workspaceId, flatApplication, flatFieldMetadataMaps, flatViewMaps, -}: FromCreateViewFieldInputToFlatViewFieldToCreateArgs): FlatViewField => { +}: FromCreateViewFieldInputToFlatViewFieldToCreateArgs): UniversalFlatViewField & { + id: string; +} => { const { fieldMetadataId, viewId, ...createViewFieldInput } = trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( rawCreateViewFieldInput, @@ -39,12 +39,9 @@ export const fromCreateViewFieldInputToFlatViewFieldToCreate = ({ return { id: viewFieldId, - fieldMetadataId, fieldMetadataUniversalIdentifier, - viewId, viewUniversalIdentifier, - workspaceId, - createdAt: createdAt, + createdAt, updatedAt: createdAt, deletedAt: null, universalIdentifier: createViewFieldInput.universalIdentifier ?? v4(), @@ -52,7 +49,6 @@ export const fromCreateViewFieldInputToFlatViewFieldToCreate = ({ size: createViewFieldInput.size ?? DEFAULT_VIEW_FIELD_SIZE, position: createViewFieldInput.position ?? 0, aggregateOperation: createViewFieldInput.aggregateOperation ?? null, - applicationId: flatApplication.id, applicationUniversalIdentifier: flatApplication.universalIdentifier, }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-delete-view-field-input-to-flat-view-field-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-delete-view-field-input-to-flat-view-field-or-throw.util.ts index 47c42b74aa..247a1001c3 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-delete-view-field-input-to-flat-view-field-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-delete-view-field-input-to-flat-view-field-or-throw.util.ts @@ -6,12 +6,12 @@ import { import { type FlatViewFieldMaps } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type'; import { type DeleteViewFieldInput } from 'src/engine/metadata-modules/view-field/dtos/inputs/delete-view-field.input'; import { ViewFieldException, ViewFieldExceptionCode, } from 'src/engine/metadata-modules/view-field/exceptions/view-field.exception'; +import { type UniversalFlatViewField } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-field.type'; export const fromDeleteViewFieldInputToFlatViewFieldOrThrow = ({ deleteViewFieldInput: rawDeleteViewFieldInput, @@ -19,7 +19,7 @@ export const fromDeleteViewFieldInputToFlatViewFieldOrThrow = ({ }: { deleteViewFieldInput: DeleteViewFieldInput; flatViewFieldMaps: FlatViewFieldMaps; -}): FlatViewField => { +}): UniversalFlatViewField => { const { id: viewFieldId } = extractAndSanitizeObjectStringFields( rawDeleteViewFieldInput, ['id'], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-destroy-view-field-input-to-flat-view-field-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-destroy-view-field-input-to-flat-view-field-or-throw.util.ts index 6aa632f5d5..98ab2b49f6 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-destroy-view-field-input-to-flat-view-field-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-destroy-view-field-input-to-flat-view-field-or-throw.util.ts @@ -6,12 +6,12 @@ import { import { type FlatViewFieldMaps } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type'; import { type DestroyViewFieldInput } from 'src/engine/metadata-modules/view-field/dtos/inputs/destroy-view-field.input'; import { ViewFieldException, ViewFieldExceptionCode, } from 'src/engine/metadata-modules/view-field/exceptions/view-field.exception'; +import { type UniversalFlatViewField } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-field.type'; export const fromDestroyViewFieldInputToFlatViewFieldOrThrow = ({ destroyViewFieldInput, @@ -19,7 +19,7 @@ export const fromDestroyViewFieldInputToFlatViewFieldOrThrow = ({ }: { destroyViewFieldInput: DestroyViewFieldInput; flatViewFieldMaps: FlatViewFieldMaps; -}): FlatViewField => { +}): UniversalFlatViewField => { const { id: viewFieldId } = extractAndSanitizeObjectStringFields( destroyViewFieldInput, ['id'], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-update-view-field-input-to-flat-view-field-to-update-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-update-view-field-input-to-flat-view-field-to-update-or-throw.util.ts index 7802df5784..fe5ada5e7d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-update-view-field-input-to-flat-view-field-to-update-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-update-view-field-input-to-flat-view-field-to-update-or-throw.util.ts @@ -8,12 +8,12 @@ import { import { FLAT_VIEW_FIELD_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view-field/constants/flat-view-field-editable-properties.constant'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { type FlatViewFieldMaps } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field-maps.type'; -import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type'; import { type UpdateViewFieldInput } from 'src/engine/metadata-modules/view-field/dtos/inputs/update-view-field.input'; import { ViewFieldException, ViewFieldExceptionCode, } from 'src/engine/metadata-modules/view-field/exceptions/view-field.exception'; +import { type UniversalFlatViewField } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-field.type'; import { mergeUpdateInExistingRecord } from 'src/utils/merge-update-in-existing-record.util'; export const fromUpdateViewFieldInputToFlatViewFieldToUpdateOrThrow = ({ @@ -22,7 +22,7 @@ export const fromUpdateViewFieldInputToFlatViewFieldToUpdateOrThrow = ({ }: { updateViewFieldInput: UpdateViewFieldInput; flatViewFieldMaps: FlatViewFieldMaps; -}): FlatViewField => { +}): UniversalFlatViewField => { const { id: viewFieldToUpdateId } = trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( rawUpdateViewFieldInput, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/is-view-field-in-lowest-position.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/is-view-field-in-lowest-position.util.ts index dc4c5a02be..6cad7a186c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/is-view-field-in-lowest-position.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/is-view-field-in-lowest-position.util.ts @@ -1,11 +1,11 @@ -import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type'; +import { type UniversalFlatViewField } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-field.type'; export const isViewFieldInLowestPosition = ({ flatViewField, otherFlatViewFields, }: { - otherFlatViewFields: FlatViewField[]; - flatViewField: FlatViewField; + otherFlatViewFields: UniversalFlatViewField[]; + flatViewField: UniversalFlatViewField; }) => { if (otherFlatViewFields.length === 0) { return true; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/constants/flat-view-filter-group-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/constants/flat-view-filter-group-editable-properties.constant.ts index f0f2ff82ee..9e89f17ca6 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/constants/flat-view-filter-group-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/constants/flat-view-filter-group-editable-properties.constant.ts @@ -1,7 +1,7 @@ -import { type FlatViewFilterGroup } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_VIEW_FILTER_GROUP_EDITABLE_PROPERTIES = [ 'parentViewFilterGroupId', 'logicalOperator', 'positionInViewFilterGroup', -] as const satisfies (keyof FlatViewFilterGroup)[]; +] as const satisfies MetadataEntityPropertyName<'viewFilterGroup'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/utils/from-create-view-filter-group-input-to-flat-view-filter-group-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/utils/from-create-view-filter-group-input-to-flat-view-filter-group-to-create.util.ts index fbbc9dc43a..988682a91b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/utils/from-create-view-filter-group-input-to-flat-view-filter-group-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/utils/from-create-view-filter-group-input-to-flat-view-filter-group-to-create.util.ts @@ -4,24 +4,22 @@ import { v4 } from 'uuid'; import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { resolveEntityRelationUniversalIdentifiers } from 'src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util'; -import { type FlatViewFilterGroup } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group.type'; import { type CreateViewFilterGroupInput } from 'src/engine/metadata-modules/view-filter-group/dtos/inputs/create-view-filter-group.input'; import { ViewFilterGroupLogicalOperator } from 'src/engine/metadata-modules/view-filter-group/enums/view-filter-group-logical-operator'; +import { type UniversalFlatViewFilterGroup } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-filter-group.type'; export const fromCreateViewFilterGroupInputToFlatViewFilterGroupToCreate = ({ createViewFilterGroupInput: rawCreateViewFilterGroupInput, - workspaceId, flatApplication, flatViewMaps, flatViewFilterGroupMaps, }: { createViewFilterGroupInput: CreateViewFilterGroupInput; - workspaceId: string; flatApplication: FlatApplication; } & Pick< AllFlatEntityMaps, 'flatViewMaps' | 'flatViewFilterGroupMaps' ->): FlatViewFilterGroup => { +>): UniversalFlatViewFilterGroup & { id: string } => { const { viewId, ...createViewFilterGroupInput } = trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( rawCreateViewFilterGroupInput, @@ -44,9 +42,7 @@ export const fromCreateViewFilterGroupInputToFlatViewFilterGroupToCreate = ({ return { id: viewFilterGroupId, - viewId, viewUniversalIdentifier, - workspaceId, createdAt, updatedAt: createdAt, deletedAt: null, @@ -54,16 +50,11 @@ export const fromCreateViewFilterGroupInputToFlatViewFilterGroupToCreate = ({ logicalOperator: createViewFilterGroupInput.logicalOperator ?? ViewFilterGroupLogicalOperator.AND, - parentViewFilterGroupId: - createViewFilterGroupInput.parentViewFilterGroupId ?? null, parentViewFilterGroupUniversalIdentifier, positionInViewFilterGroup: createViewFilterGroupInput.positionInViewFilterGroup ?? null, - applicationId: flatApplication.id, applicationUniversalIdentifier: flatApplication.universalIdentifier, - viewFilterIds: [], viewFilterUniversalIdentifiers: [], - childViewFilterGroupIds: [], childViewFilterGroupUniversalIdentifiers: [], }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/utils/from-delete-view-filter-group-input-to-flat-view-filter-group-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/utils/from-delete-view-filter-group-input-to-flat-view-filter-group-or-throw.util.ts index 7d1dea4727..550f39a6b2 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/utils/from-delete-view-filter-group-input-to-flat-view-filter-group-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/utils/from-delete-view-filter-group-input-to-flat-view-filter-group-or-throw.util.ts @@ -5,12 +5,12 @@ import { import { type FlatViewFilterGroupMaps } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { type FlatViewFilterGroup } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group.type'; import { type DeleteViewFilterGroupInput } from 'src/engine/metadata-modules/view-filter-group/dtos/inputs/delete-view-filter-group.input'; import { ViewFilterGroupException, ViewFilterGroupExceptionCode, } from 'src/engine/metadata-modules/view-filter-group/exceptions/view-filter-group.exception'; +import { type UniversalFlatViewFilterGroup } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-filter-group.type'; export const fromDeleteViewFilterGroupInputToFlatViewFilterGroupOrThrow = ({ deleteViewFilterGroupInput: rawDeleteViewFilterGroupInput, @@ -18,7 +18,7 @@ export const fromDeleteViewFilterGroupInputToFlatViewFilterGroupOrThrow = ({ }: { deleteViewFilterGroupInput: DeleteViewFilterGroupInput; flatViewFilterGroupMaps: FlatViewFilterGroupMaps; -}): FlatViewFilterGroup => { +}): UniversalFlatViewFilterGroup => { const { id: viewFilterGroupId } = extractAndSanitizeObjectStringFields( rawDeleteViewFilterGroupInput, ['id'], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/utils/from-destroy-view-filter-group-input-to-flat-view-filter-group-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/utils/from-destroy-view-filter-group-input-to-flat-view-filter-group-or-throw.util.ts index 6fd04ac8db..e3a3f4b086 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/utils/from-destroy-view-filter-group-input-to-flat-view-filter-group-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/utils/from-destroy-view-filter-group-input-to-flat-view-filter-group-or-throw.util.ts @@ -5,12 +5,12 @@ import { import { type FlatViewFilterGroupMaps } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { type FlatViewFilterGroup } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group.type'; import { type DestroyViewFilterGroupInput } from 'src/engine/metadata-modules/view-filter-group/dtos/inputs/destroy-view-filter-group.input'; import { ViewFilterGroupException, ViewFilterGroupExceptionCode, } from 'src/engine/metadata-modules/view-filter-group/exceptions/view-filter-group.exception'; +import { type UniversalFlatViewFilterGroup } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-filter-group.type'; export const fromDestroyViewFilterGroupInputToFlatViewFilterGroupOrThrow = ({ destroyViewFilterGroupInput, @@ -18,7 +18,7 @@ export const fromDestroyViewFilterGroupInputToFlatViewFilterGroupOrThrow = ({ }: { destroyViewFilterGroupInput: DestroyViewFilterGroupInput; flatViewFilterGroupMaps: FlatViewFilterGroupMaps; -}): FlatViewFilterGroup => { +}): UniversalFlatViewFilterGroup => { const { id: viewFilterGroupId } = extractAndSanitizeObjectStringFields( destroyViewFilterGroupInput, ['id'], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/utils/from-update-view-filter-group-input-to-flat-view-filter-group-to-update-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/utils/from-update-view-filter-group-input-to-flat-view-filter-group-to-update-or-throw.util.ts index 77449d468b..85929e07c0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/utils/from-update-view-filter-group-input-to-flat-view-filter-group-to-update-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter-group/utils/from-update-view-filter-group-input-to-flat-view-filter-group-to-update-or-throw.util.ts @@ -8,12 +8,12 @@ import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/ import { resolveEntityRelationUniversalIdentifiers } from 'src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util'; import { FLAT_VIEW_FILTER_GROUP_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view-filter-group/constants/flat-view-filter-group-editable-properties.constant'; import { type FlatViewFilterGroupMaps } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group-maps.type'; -import { type FlatViewFilterGroup } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group.type'; import { type UpdateViewFilterGroupInput } from 'src/engine/metadata-modules/view-filter-group/dtos/inputs/update-view-filter-group.input'; import { ViewFilterGroupException, ViewFilterGroupExceptionCode, } from 'src/engine/metadata-modules/view-filter-group/exceptions/view-filter-group.exception'; +import { type UniversalFlatViewFilterGroup } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-filter-group.type'; import { mergeUpdateInExistingRecord } from 'src/utils/merge-update-in-existing-record.util'; export const fromUpdateViewFilterGroupInputToFlatViewFilterGroupToUpdateOrThrow = @@ -23,7 +23,7 @@ export const fromUpdateViewFilterGroupInputToFlatViewFilterGroupToUpdateOrThrow }: { updateViewFilterGroupInput: UpdateViewFilterGroupInput & { id: string }; flatViewFilterGroupMaps: FlatViewFilterGroupMaps; - }): FlatViewFilterGroup => { + }): UniversalFlatViewFilterGroup => { const { id: viewFilterGroupToUpdateId } = trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( rawUpdateViewFilterGroupInput, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/constants/flat-view-filter-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/constants/flat-view-filter-editable-properties.constant.ts index 81b30a955a..f9473317d8 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/constants/flat-view-filter-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/constants/flat-view-filter-editable-properties.constant.ts @@ -1,4 +1,4 @@ -import { type FlatViewFilter } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_VIEW_FILTER_EDITABLE_PROPERTIES = [ 'fieldMetadataId', @@ -7,4 +7,4 @@ export const FLAT_VIEW_FILTER_EDITABLE_PROPERTIES = [ 'viewFilterGroupId', 'positionInViewFilterGroup', 'subFieldName', -] as const satisfies (keyof FlatViewFilter)[]; +] as const satisfies MetadataEntityPropertyName<'viewFilter'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-create-view-filter-input-to-flat-view-filter-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-create-view-filter-input-to-flat-view-filter-to-create.util.ts index 068bf2da4a..ce83cd262c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-create-view-filter-input-to-flat-view-filter-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-create-view-filter-input-to-flat-view-filter-to-create.util.ts @@ -5,24 +5,22 @@ import { v4 } from 'uuid'; import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { resolveEntityRelationUniversalIdentifiers } from 'src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util'; -import { type FlatViewFilter } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type'; import { type CreateViewFilterInput } from 'src/engine/metadata-modules/view-filter/dtos/inputs/create-view-filter.input'; +import { type UniversalFlatViewFilter } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-filter.type'; export const fromCreateViewFilterInputToFlatViewFilterToCreate = ({ createViewFilterInput: rawCreateViewFilterInput, - workspaceId, flatApplication, flatFieldMetadataMaps, flatViewMaps, flatViewFilterGroupMaps, }: { createViewFilterInput: CreateViewFilterInput; - workspaceId: string; flatApplication: FlatApplication; } & Pick< AllFlatEntityMaps, 'flatFieldMetadataMaps' | 'flatViewMaps' | 'flatViewFilterGroupMaps' ->): FlatViewFilter => { +>): UniversalFlatViewFilter & { id: string } => { const { fieldMetadataId, viewId, value, ...createViewFilterInput } = trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( rawCreateViewFilterInput, @@ -59,23 +57,18 @@ export const fromCreateViewFilterInputToFlatViewFilterToCreate = ({ return { id: viewFilterId, - fieldMetadataId, fieldMetadataUniversalIdentifier, - viewId, viewUniversalIdentifier, - workspaceId, - createdAt: createdAt, + createdAt, updatedAt: createdAt, deletedAt: null, universalIdentifier: createViewFilterInput.universalIdentifier ?? v4(), operand: createViewFilterInput.operand ?? ViewFilterOperand.CONTAINS, - value: value, - viewFilterGroupId: createViewFilterInput.viewFilterGroupId ?? null, + value, viewFilterGroupUniversalIdentifier, positionInViewFilterGroup: createViewFilterInput.positionInViewFilterGroup ?? null, subFieldName: createViewFilterInput.subFieldName ?? null, - applicationId: flatApplication.id, applicationUniversalIdentifier: flatApplication.universalIdentifier, }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-delete-view-filter-input-to-flat-view-filter-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-delete-view-filter-input-to-flat-view-filter-or-throw.util.ts index e2045a64a9..80a61c0107 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-delete-view-filter-input-to-flat-view-filter-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-delete-view-filter-input-to-flat-view-filter-or-throw.util.ts @@ -6,12 +6,12 @@ import { import { type FlatViewFilterMaps } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { type FlatViewFilter } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type'; import { type DeleteViewFilterInput } from 'src/engine/metadata-modules/view-filter/dtos/inputs/delete-view-filter.input'; import { ViewFilterException, ViewFilterExceptionCode, } from 'src/engine/metadata-modules/view-filter/exceptions/view-filter.exception'; +import { type UniversalFlatViewFilter } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-filter.type'; export const fromDeleteViewFilterInputToFlatViewFilterOrThrow = ({ deleteViewFilterInput: rawDeleteViewFilterInput, @@ -19,7 +19,7 @@ export const fromDeleteViewFilterInputToFlatViewFilterOrThrow = ({ }: { deleteViewFilterInput: DeleteViewFilterInput; flatViewFilterMaps: FlatViewFilterMaps; -}): FlatViewFilter => { +}): UniversalFlatViewFilter => { const { id: viewFilterId } = extractAndSanitizeObjectStringFields( rawDeleteViewFilterInput, ['id'], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-destroy-view-filter-input-to-flat-view-filter-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-destroy-view-filter-input-to-flat-view-filter-or-throw.util.ts index 25a635d896..eb663e56b1 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-destroy-view-filter-input-to-flat-view-filter-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-destroy-view-filter-input-to-flat-view-filter-or-throw.util.ts @@ -6,12 +6,12 @@ import { import { type FlatViewFilterMaps } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { type FlatViewFilter } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type'; import { type DestroyViewFilterInput } from 'src/engine/metadata-modules/view-filter/dtos/inputs/destroy-view-filter.input'; import { ViewFilterException, ViewFilterExceptionCode, } from 'src/engine/metadata-modules/view-filter/exceptions/view-filter.exception'; +import { type UniversalFlatViewFilter } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-filter.type'; export const fromDestroyViewFilterInputToFlatViewFilterOrThrow = ({ destroyViewFilterInput, @@ -19,7 +19,7 @@ export const fromDestroyViewFilterInputToFlatViewFilterOrThrow = ({ }: { destroyViewFilterInput: DestroyViewFilterInput; flatViewFilterMaps: FlatViewFilterMaps; -}): FlatViewFilter => { +}): UniversalFlatViewFilter => { const { id: viewFilterId } = extractAndSanitizeObjectStringFields( destroyViewFilterInput, ['id'], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-update-view-filter-input-to-flat-view-filter-to-update-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-update-view-filter-input-to-flat-view-filter-to-update-or-throw.util.ts index 17eaaee13a..0325018584 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-update-view-filter-input-to-flat-view-filter-to-update-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-update-view-filter-input-to-flat-view-filter-to-update-or-throw.util.ts @@ -10,12 +10,12 @@ import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/ import { resolveEntityRelationUniversalIdentifiers } from 'src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util'; import { FLAT_VIEW_FILTER_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view-filter/constants/flat-view-filter-editable-properties.constant'; import { type FlatViewFilterMaps } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter-maps.type'; -import { type FlatViewFilter } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type'; import { type UpdateViewFilterInput } from 'src/engine/metadata-modules/view-filter/dtos/inputs/update-view-filter.input'; import { ViewFilterException, ViewFilterExceptionCode, } from 'src/engine/metadata-modules/view-filter/exceptions/view-filter.exception'; +import { type UniversalFlatViewFilter } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-filter.type'; import { mergeUpdateInExistingRecord } from 'src/utils/merge-update-in-existing-record.util'; export const fromUpdateViewFilterInputToFlatViewFilterToUpdateOrThrow = ({ @@ -29,7 +29,7 @@ export const fromUpdateViewFilterInputToFlatViewFilterToUpdateOrThrow = ({ } & Pick< AllFlatEntityMaps, 'flatFieldMetadataMaps' | 'flatViewFilterGroupMaps' ->): FlatViewFilter => { +>): UniversalFlatViewFilter => { const { id: viewFilterToUpdateId } = trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( rawUpdateViewFilterInput, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/flat-view-group-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/flat-view-group-editable-properties.constant.ts index a45e8ce2b1..6d9f6cad26 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/flat-view-group-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/flat-view-group-editable-properties.constant.ts @@ -1,7 +1,7 @@ -import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_VIEW_GROUP_EDITABLE_PROPERTIES = [ 'isVisible', 'fieldValue', 'position', -] as const satisfies (keyof FlatViewGroup)[]; +] as const satisfies MetadataEntityPropertyName<'viewGroup'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/compute-flat-view-groups-on-view-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/compute-flat-view-groups-on-view-create.util.ts index 7a107c15de..b61cc12786 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/compute-flat-view-groups-on-view-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/compute-flat-view-groups-on-view-create.util.ts @@ -8,20 +8,18 @@ import { } from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; +import { type UniversalFlatViewGroup } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-group.type'; type ComputeFlatViewGroupsOnViewCreateArgs = { - flatViewToCreateId: string; flatViewToCreateUniversalIdentifier: string; mainGroupByFieldMetadataId: string; } & Pick; export const computeFlatViewGroupsOnViewCreate = ({ - flatViewToCreateId, flatViewToCreateUniversalIdentifier, mainGroupByFieldMetadataId, flatFieldMetadataMaps, -}: ComputeFlatViewGroupsOnViewCreateArgs): FlatViewGroup[] => { +}: ComputeFlatViewGroupsOnViewCreateArgs): UniversalFlatViewGroup[] => { const mainGroupByFieldMetadata = findFlatEntityByIdInFlatEntityMaps({ flatEntityId: mainGroupByFieldMetadataId, flatEntityMaps: flatFieldMetadataMaps, @@ -36,41 +34,31 @@ export const computeFlatViewGroupsOnViewCreate = ({ const createdAt = new Date().toISOString(); - const flatViewGroupsFromOptions: FlatViewGroup[] = ( + const flatViewGroupsFromOptions: UniversalFlatViewGroup[] = ( mainGroupByFieldMetadata.options ?? [] - ).map((option, index) => { - const viewGroupId = v4(); + ).map((option, index) => ({ + viewUniversalIdentifier: flatViewToCreateUniversalIdentifier, + createdAt, + updatedAt: createdAt, + deletedAt: null, + universalIdentifier: v4(), + isVisible: index < VIEW_GROUP_VISIBLE_OPTIONS_MAX, + fieldValue: option.value, + position: index, + applicationUniversalIdentifier: + mainGroupByFieldMetadata.applicationUniversalIdentifier, + })); - return { - id: viewGroupId, - fieldMetadataId: mainGroupByFieldMetadata.id, - viewId: flatViewToCreateId, - viewUniversalIdentifier: flatViewToCreateUniversalIdentifier, - workspaceId: mainGroupByFieldMetadata.workspaceId, - createdAt, - updatedAt: createdAt, - deletedAt: null, - universalIdentifier: viewGroupId, - isVisible: index < VIEW_GROUP_VISIBLE_OPTIONS_MAX, - fieldValue: option.value, - position: index, - applicationId: mainGroupByFieldMetadata.applicationId, - applicationUniversalIdentifier: - mainGroupByFieldMetadata.applicationUniversalIdentifier, - }; - }); - - const flatViewGroups: FlatViewGroup[] = [...flatViewGroupsFromOptions]; + const flatViewGroups: UniversalFlatViewGroup[] = [ + ...flatViewGroupsFromOptions, + ]; if (mainGroupByFieldMetadata.isNullable === true) { const emptyGroupId = v4(); const emptyGroupPosition = flatViewGroupsFromOptions.length; flatViewGroups.push({ - id: emptyGroupId, - viewId: flatViewToCreateId, viewUniversalIdentifier: flatViewToCreateUniversalIdentifier, - workspaceId: mainGroupByFieldMetadata.workspaceId, createdAt, updatedAt: createdAt, deletedAt: null, @@ -78,7 +66,6 @@ export const computeFlatViewGroupsOnViewCreate = ({ isVisible: emptyGroupPosition < VIEW_GROUP_VISIBLE_OPTIONS_MAX, fieldValue: '', position: emptyGroupPosition, - applicationId: mainGroupByFieldMetadata.applicationId, applicationUniversalIdentifier: mainGroupByFieldMetadata.applicationUniversalIdentifier, }); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util.ts index d20a6efc4e..767f6a2122 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util.ts @@ -4,19 +4,19 @@ import { v4 } from 'uuid'; import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { resolveEntityRelationUniversalIdentifiers } from 'src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util'; -import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; import { type CreateViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/create-view-group.input'; +import { type UniversalFlatViewGroup } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-group.type'; export const fromCreateViewGroupInputToFlatViewGroupToCreate = ({ createViewGroupInput: rawCreateViewGroupInput, - workspaceId, flatApplication, flatViewMaps, }: { createViewGroupInput: CreateViewGroupInput; - workspaceId: string; flatApplication: FlatApplication; -} & Pick): FlatViewGroup => { +} & Pick): UniversalFlatViewGroup & { + id: string; +} => { const { viewId, ...createViewGroupInput } = trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( rawCreateViewGroupInput, @@ -36,17 +36,14 @@ export const fromCreateViewGroupInputToFlatViewGroupToCreate = ({ return { id: viewGroupId, - viewId, viewUniversalIdentifier, - workspaceId, - createdAt: createdAt, + createdAt, updatedAt: createdAt, deletedAt: null, universalIdentifier: createViewGroupInput.universalIdentifier ?? v4(), isVisible: createViewGroupInput.isVisible ?? true, fieldValue: createViewGroupInput.fieldValue, position: createViewGroupInput.position ?? 0, - applicationId: flatApplication.id, applicationUniversalIdentifier: flatApplication.universalIdentifier, }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-delete-view-group-input-to-flat-view-group-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-delete-view-group-input-to-flat-view-group-or-throw.util.ts index 4b1626e527..5a559500ff 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-delete-view-group-input-to-flat-view-group-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-delete-view-group-input-to-flat-view-group-or-throw.util.ts @@ -6,12 +6,12 @@ import { import { type FlatViewGroupMaps } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; import { type DeleteViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/delete-view-group.input'; import { ViewGroupException, ViewGroupExceptionCode, } from 'src/engine/metadata-modules/view-group/exceptions/view-group.exception'; +import { type UniversalFlatViewGroup } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-group.type'; export const fromDeleteViewGroupInputToFlatViewGroupOrThrow = ({ deleteViewGroupInput: rawDeleteViewGroupInput, @@ -19,7 +19,7 @@ export const fromDeleteViewGroupInputToFlatViewGroupOrThrow = ({ }: { deleteViewGroupInput: DeleteViewGroupInput; flatViewGroupMaps: FlatViewGroupMaps; -}): FlatViewGroup => { +}): UniversalFlatViewGroup => { const { id: viewGroupId } = extractAndSanitizeObjectStringFields( rawDeleteViewGroupInput, ['id'], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-destroy-view-group-input-to-flat-view-group-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-destroy-view-group-input-to-flat-view-group-or-throw.util.ts index 7392806acd..256aa382f8 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-destroy-view-group-input-to-flat-view-group-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-destroy-view-group-input-to-flat-view-group-or-throw.util.ts @@ -6,12 +6,12 @@ import { import { type FlatViewGroupMaps } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; import { type DestroyViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/destroy-view-group.input'; import { ViewGroupException, ViewGroupExceptionCode, } from 'src/engine/metadata-modules/view-group/exceptions/view-group.exception'; +import { type UniversalFlatViewGroup } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-group.type'; export const fromDestroyViewGroupInputToFlatViewGroupOrThrow = ({ destroyViewGroupInput, @@ -19,7 +19,7 @@ export const fromDestroyViewGroupInputToFlatViewGroupOrThrow = ({ }: { destroyViewGroupInput: DestroyViewGroupInput; flatViewGroupMaps: FlatViewGroupMaps; -}): FlatViewGroup => { +}): UniversalFlatViewGroup => { const { id: viewGroupId } = extractAndSanitizeObjectStringFields( destroyViewGroupInput, ['id'], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-update-view-group-input-to-flat-view-group-to-update-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-update-view-group-input-to-flat-view-group-to-update-or-throw.util.ts index 431b032a10..c92a8e1b93 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-update-view-group-input-to-flat-view-group-to-update-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-update-view-group-input-to-flat-view-group-to-update-or-throw.util.ts @@ -14,6 +14,7 @@ import { ViewGroupException, ViewGroupExceptionCode, } from 'src/engine/metadata-modules/view-group/exceptions/view-group.exception'; +import { type UniversalFlatViewGroup } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-group.type'; import { mergeUpdateInExistingRecord } from 'src/utils/merge-update-in-existing-record.util'; export const fromUpdateViewGroupInputToFlatViewGroupToUpdateOrThrow = ({ @@ -22,7 +23,7 @@ export const fromUpdateViewGroupInputToFlatViewGroupToUpdateOrThrow = ({ }: { updateViewGroupInput: UpdateViewGroupInput; flatViewGroupMaps: FlatEntityMaps; -}): FlatViewGroup => { +}): UniversalFlatViewGroup => { const { id: viewGroupToUpdateId, update } = trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( rawUpdateViewGroupInput, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view/constants/flat-view-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view/constants/flat-view-editable-properties.constant.ts index 5cb4380e65..b7b8fcd1e3 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view/constants/flat-view-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view/constants/flat-view-editable-properties.constant.ts @@ -1,4 +1,4 @@ -import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_VIEW_EDITABLE_PROPERTIES = [ 'name', @@ -15,4 +15,4 @@ export const FLAT_VIEW_EDITABLE_PROPERTIES = [ 'visibility', 'mainGroupByFieldMetadataId', 'shouldHideEmptyGroups', -] as const satisfies (keyof FlatView)[]; +] as const satisfies MetadataEntityPropertyName<'view'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-create-view-input-to-flat-view-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-create-view-input-to-flat-view-to-create.util.ts index 6a2d953a18..231b3ddb76 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-create-view-input-to-flat-view-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-create-view-input-to-flat-view-to-create.util.ts @@ -7,31 +7,29 @@ import { v4 } from 'uuid'; import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { resolveEntityRelationUniversalIdentifiers } from 'src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util'; -import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; import { computeFlatViewGroupsOnViewCreate } from 'src/engine/metadata-modules/flat-view-group/utils/compute-flat-view-groups-on-view-create.util'; -import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; import { type CreateViewInput } from 'src/engine/metadata-modules/view/dtos/inputs/create-view.input'; import { ViewOpenRecordIn } from 'src/engine/metadata-modules/view/enums/view-open-record-in'; import { ViewType } from 'src/engine/metadata-modules/view/enums/view-type.enum'; import { ViewVisibility } from 'src/engine/metadata-modules/view/enums/view-visibility.enum'; +import { type UniversalFlatViewGroup } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-group.type'; +import { type UniversalFlatView } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view.type'; export const fromCreateViewInputToFlatViewToCreate = ({ createViewInput: rawCreateViewInput, - workspaceId, createdByUserWorkspaceId, flatApplication, flatFieldMetadataMaps, flatObjectMetadataMaps, }: { createViewInput: CreateViewInput; - workspaceId: string; createdByUserWorkspaceId?: string; flatApplication: FlatApplication; flatFieldMetadataMaps: AllFlatEntityMaps['flatFieldMetadataMaps']; flatObjectMetadataMaps: AllFlatEntityMaps['flatObjectMetadataMaps']; }): { - flatViewToCreate: FlatView; - flatViewGroupsToCreate: FlatViewGroup[]; + flatViewToCreate: UniversalFlatView & { id: string }; + flatViewGroupsToCreate: UniversalFlatViewGroup[]; } => { const { objectMetadataId, ...createViewInput } = trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( @@ -59,29 +57,25 @@ export const fromCreateViewInputToFlatViewToCreate = ({ flatEntityMaps: { flatObjectMetadataMaps, flatFieldMetadataMaps }, }); - const flatViewToCreate = { + const mainGroupByFieldMetadataId = + createViewInput.mainGroupByFieldMetadataId ?? null; + + const flatViewToCreate: UniversalFlatView & { id: string } = { id: viewId, - objectMetadataId, objectMetadataUniversalIdentifier, - workspaceId, name: createViewInput.name, - createdAt: createdAt, + createdAt, updatedAt: createdAt, deletedAt: null, isCustom: true, anyFieldFilterValue: createViewInput.anyFieldFilterValue ?? null, - calendarFieldMetadataId: createViewInput.calendarFieldMetadataId ?? null, calendarFieldMetadataUniversalIdentifier, calendarLayout: createViewInput.calendarLayout ?? null, icon: createViewInput.icon, isCompact: createViewInput.isCompact ?? false, shouldHideEmptyGroups: createViewInput.shouldHideEmptyGroups ?? false, kanbanAggregateOperation: createViewInput.kanbanAggregateOperation ?? null, - kanbanAggregateOperationFieldMetadataId: - createViewInput.kanbanAggregateOperationFieldMetadataId ?? null, kanbanAggregateOperationFieldMetadataUniversalIdentifier, - mainGroupByFieldMetadataId: - createViewInput.mainGroupByFieldMetadataId ?? null, mainGroupByFieldMetadataUniversalIdentifier, key: createViewInput.key ?? null, openRecordIn: createViewInput.openRecordIn ?? ViewOpenRecordIn.SIDE_PANEL, @@ -90,25 +84,19 @@ export const fromCreateViewInputToFlatViewToCreate = ({ universalIdentifier: createViewInput.universalIdentifier ?? v4(), visibility: createViewInput.visibility ?? ViewVisibility.WORKSPACE, createdByUserWorkspaceId: createdByUserWorkspaceId ?? null, - viewFieldIds: [], viewFieldUniversalIdentifiers: [], - viewFilterIds: [], viewFilterUniversalIdentifiers: [], - viewGroupIds: [], viewGroupUniversalIdentifiers: [], - viewFilterGroupIds: [], viewFilterGroupUniversalIdentifiers: [], - applicationId: flatApplication.id, applicationUniversalIdentifier: flatApplication.universalIdentifier, }; - let flatViewGroupsToCreate: FlatViewGroup[] = []; + let flatViewGroupsToCreate: UniversalFlatViewGroup[] = []; - if (isDefined(flatViewToCreate.mainGroupByFieldMetadataId)) { + if (isDefined(mainGroupByFieldMetadataId)) { flatViewGroupsToCreate = computeFlatViewGroupsOnViewCreate({ - flatViewToCreateId: flatViewToCreate.id, flatViewToCreateUniversalIdentifier: flatViewToCreate.universalIdentifier, - mainGroupByFieldMetadataId: flatViewToCreate.mainGroupByFieldMetadataId, + mainGroupByFieldMetadataId, flatFieldMetadataMaps, }); } diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-delete-view-input-to-flat-view-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-delete-view-input-to-flat-view-or-throw.util.ts index cd90f0d10d..49a27b2e3f 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-delete-view-input-to-flat-view-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-delete-view-input-to-flat-view-or-throw.util.ts @@ -6,12 +6,12 @@ import { import { type FlatViewMaps } from 'src/engine/metadata-modules/flat-view/types/flat-view-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; import { type DeleteViewInput } from 'src/engine/metadata-modules/view/dtos/inputs/delete-view.input'; import { ViewException, ViewExceptionCode, } from 'src/engine/metadata-modules/view/exceptions/view.exception'; +import { type UniversalFlatView } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view.type'; export const fromDeleteViewInputToFlatViewOrThrow = ({ deleteViewInput: rawDeleteViewInput, @@ -19,7 +19,7 @@ export const fromDeleteViewInputToFlatViewOrThrow = ({ }: { deleteViewInput: DeleteViewInput; flatViewMaps: FlatViewMaps; -}): FlatView => { +}): UniversalFlatView => { const { id: viewId } = extractAndSanitizeObjectStringFields( rawDeleteViewInput, ['id'], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-destroy-view-input-to-flat-view-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-destroy-view-input-to-flat-view-or-throw.util.ts index ead2d7aee2..dc0eb3f5bb 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-destroy-view-input-to-flat-view-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-destroy-view-input-to-flat-view-or-throw.util.ts @@ -6,12 +6,12 @@ import { import { type FlatViewMaps } from 'src/engine/metadata-modules/flat-view/types/flat-view-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; import { type DestroyViewInput } from 'src/engine/metadata-modules/view/dtos/inputs/destroy-view.input'; import { ViewException, ViewExceptionCode, } from 'src/engine/metadata-modules/view/exceptions/view.exception'; +import { type UniversalFlatView } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view.type'; export const fromDestroyViewInputToFlatViewOrThrow = ({ destroyViewInput: rawDestroyViewInput, @@ -19,7 +19,7 @@ export const fromDestroyViewInputToFlatViewOrThrow = ({ }: { destroyViewInput: DestroyViewInput; flatViewMaps: FlatViewMaps; -}): FlatView => { +}): UniversalFlatView => { const { id: viewId } = extractAndSanitizeObjectStringFields( rawDestroyViewInput, ['id'], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-update-view-input-to-flat-view-to-update-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-update-view-input-to-flat-view-to-update-or-throw.util.ts index 7d7d9c46ae..b378b7ee89 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-update-view-input-to-flat-view-to-update-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-update-view-input-to-flat-view-to-update-or-throw.util.ts @@ -10,16 +10,16 @@ import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/ import { resolveEntityRelationUniversalIdentifiers } from 'src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { type FlatViewGroupMaps } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group-maps.type'; -import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; import { FLAT_VIEW_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view/constants/flat-view-editable-properties.constant'; import { type FlatViewMaps } from 'src/engine/metadata-modules/flat-view/types/flat-view-maps.type'; -import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; import { handleFlatViewUpdateSideEffect } from 'src/engine/metadata-modules/flat-view/utils/handle-flat-view-update-side-effect.util'; import { type UpdateViewInput } from 'src/engine/metadata-modules/view/dtos/inputs/update-view.input'; import { ViewException, ViewExceptionCode, } from 'src/engine/metadata-modules/view/exceptions/view.exception'; +import { type UniversalFlatViewGroup } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-group.type'; +import { type UniversalFlatView } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view.type'; import { mergeUpdateInExistingRecord } from 'src/utils/merge-update-in-existing-record.util'; export const fromUpdateViewInputToFlatViewToUpdateOrThrow = ({ @@ -35,9 +35,9 @@ export const fromUpdateViewInputToFlatViewToUpdateOrThrow = ({ flatFieldMetadataMaps: FlatEntityMaps; userWorkspaceId?: string; }): { - flatViewToUpdate: FlatView; - flatViewGroupsToDelete: FlatViewGroup[]; - flatViewGroupsToCreate: FlatViewGroup[]; + flatViewToUpdate: UniversalFlatView; + flatViewGroupsToDelete: UniversalFlatViewGroup[]; + flatViewGroupsToCreate: UniversalFlatViewGroup[]; } => { const { id: viewToUpdateId } = trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/handle-flat-view-update-side-effect.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/handle-flat-view-update-side-effect.util.ts index 5f5096561f..c6a8925ac0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/handle-flat-view-update-side-effect.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/handle-flat-view-update-side-effect.util.ts @@ -3,13 +3,13 @@ import { isDefined } from 'twenty-shared/utils'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; import { computeFlatViewGroupsOnViewCreate } from 'src/engine/metadata-modules/flat-view-group/utils/compute-flat-view-groups-on-view-create.util'; import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; +import { type UniversalFlatViewGroup } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-group.type'; export type FlatViewUpdateSideEffects = { - flatViewGroupsToDelete: FlatViewGroup[]; - flatViewGroupsToCreate: FlatViewGroup[]; + flatViewGroupsToDelete: UniversalFlatViewGroup[]; + flatViewGroupsToCreate: UniversalFlatViewGroup[]; }; type HandleFlatViewUpdateSideEffectArgs = FromTo & @@ -50,7 +50,6 @@ export const handleFlatViewUpdateSideEffect = ({ } sideEffectResult.flatViewGroupsToCreate = computeFlatViewGroupsOnViewCreate({ - flatViewToCreateId: toFlatView.id, flatViewToCreateUniversalIdentifier: toFlatView.universalIdentifier, mainGroupByFieldMetadataId: newMainGroupByFieldMetadataId, flatFieldMetadataMaps, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-webhook/constants/flat-webhook-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-webhook/constants/flat-webhook-editable-properties.constant.ts index bb3dbbc852..9173c02af2 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-webhook/constants/flat-webhook-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-webhook/constants/flat-webhook-editable-properties.constant.ts @@ -1,8 +1,8 @@ -import { type FlatWebhook } from 'src/engine/metadata-modules/flat-webhook/types/flat-webhook.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_WEBHOOK_EDITABLE_PROPERTIES = [ 'targetUrl', 'operations', 'description', 'secret', -] as const satisfies (keyof FlatWebhook)[]; +] as const satisfies MetadataEntityPropertyName<'webhook'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/index-metadata/utils/generate-deterministic-index-name-v2.ts b/packages/twenty-server/src/engine/metadata-modules/index-metadata/utils/generate-deterministic-index-name-v2.ts index f31f27a4f5..96c9e978c7 100644 --- a/packages/twenty-server/src/engine/metadata-modules/index-metadata/utils/generate-deterministic-index-name-v2.ts +++ b/packages/twenty-server/src/engine/metadata-modules/index-metadata/utils/generate-deterministic-index-name-v2.ts @@ -1,10 +1,13 @@ import { createHash } from 'crypto'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; import { computeTableName } from 'src/engine/utils/compute-table-name.util'; type GenerateDeterministicIndexNameArgs = { - flatObjectMetadata: Pick; + flatObjectMetadata: Pick< + UniversalFlatObjectMetadata, + 'nameSingular' | 'isCustom' + >; isUnique?: boolean; orderedIndexColumnNames: string[]; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/index-metadata/utils/generate-flat-index.util.ts b/packages/twenty-server/src/engine/metadata-modules/index-metadata/utils/generate-flat-index.util.ts index 4d595ea8f5..fdf5767c12 100644 --- a/packages/twenty-server/src/engine/metadata-modules/index-metadata/utils/generate-flat-index.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/index-metadata/utils/generate-flat-index.util.ts @@ -4,28 +4,29 @@ import { FlatEntityMapsException, FlatEntityMapsExceptionCode, } from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; -import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { isMorphOrRelationUniversalFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; import { generateDeterministicIndexNameV2 } from 'src/engine/metadata-modules/index-metadata/utils/generate-deterministic-index-name-v2'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; export type GenerateFlatIndexArgs = { - flatObjectMetadata: FlatObjectMetadata; - objectFlatFieldMetadatas: FlatFieldMetadata[]; - flatIndex: Omit; + flatObjectMetadata: UniversalFlatObjectMetadata; + objectFlatFieldMetadatas: UniversalFlatFieldMetadata[]; + flatIndex: Omit; }; export const generateFlatIndexMetadataWithNameOrThrow = ({ flatObjectMetadata, objectFlatFieldMetadatas, flatIndex, -}: GenerateFlatIndexArgs): FlatIndexMetadata => { - const orderedFlatFields = flatIndex.flatIndexFieldMetadatas +}: GenerateFlatIndexArgs): UniversalFlatIndexMetadata => { + const orderedFlatFields = flatIndex.universalFlatIndexFieldMetadatas .sort((a, b) => a.order - b.order) .map((flatIndexField) => { const relatedFlatFieldMetadata = objectFlatFieldMetadatas.find( (flatFieldMetadata) => - flatFieldMetadata.id === flatIndexField.fieldMetadataId, + flatFieldMetadata.universalIdentifier === + flatIndexField.fieldMetadataUniversalIdentifier, ); if (!isDefined(relatedFlatFieldMetadata)) { @@ -35,8 +36,10 @@ export const generateFlatIndexMetadataWithNameOrThrow = ({ ); } - const name = isMorphOrRelationFlatFieldMetadata(relatedFlatFieldMetadata) - ? (relatedFlatFieldMetadata.settings.joinColumnName ?? + const name = isMorphOrRelationUniversalFlatFieldMetadata( + relatedFlatFieldMetadata, + ) + ? (relatedFlatFieldMetadata.universalSettings.joinColumnName ?? relatedFlatFieldMetadata.name) : relatedFlatFieldMetadata.name; diff --git a/packages/twenty-server/src/engine/metadata-modules/logic-function/constants/flat-logic-function-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/logic-function/constants/flat-logic-function-editable-properties.constant.ts index efc3761bf2..a00c3efaa2 100644 --- a/packages/twenty-server/src/engine/metadata-modules/logic-function/constants/flat-logic-function-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/logic-function/constants/flat-logic-function-editable-properties.constant.ts @@ -1,4 +1,4 @@ -import { type FlatLogicFunction } from 'src/engine/metadata-modules/logic-function/types/flat-logic-function.type'; +import { type MetadataEntityPropertyName } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; export const FLAT_LOGIC_FUNCTION_EDITABLE_PROPERTIES = [ 'name', @@ -12,4 +12,4 @@ export const FLAT_LOGIC_FUNCTION_EDITABLE_PROPERTIES = [ 'cronTriggerSettings', 'databaseEventTriggerSettings', 'httpRouteTriggerSettings', -] as const satisfies (keyof FlatLogicFunction)[]; +] as const satisfies (MetadataEntityPropertyName<'logicFunction'> | 'code')[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/constants/object-metadata-standard-overrides-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/constants/object-metadata-standard-overrides-properties.constant.ts index 55b56039da..49e305a6f4 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/constants/object-metadata-standard-overrides-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/constants/object-metadata-standard-overrides-properties.constant.ts @@ -1,8 +1,8 @@ -import { type FlatEntityPropertiesToCompare } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-to-compare.type'; +import { type MetadataUniversalFlatEntityPropertiesToCompare } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-properties-to-compare.type'; export const OBJECT_METADATA_STANDARD_OVERRIDES_PROPERTIES = [ 'labelSingular', 'labelPlural', 'description', 'icon', -] as const satisfies FlatEntityPropertiesToCompare<'objectMetadata'>[]; +] as const satisfies MetadataUniversalFlatEntityPropertiesToCompare<'objectMetadata'>[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts index 99de995c06..d8a1fdb60b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts @@ -4,20 +4,17 @@ import { InjectRepository } from '@nestjs/typeorm'; import { TypeOrmQueryService } from '@ptc-org/nestjs-query-typeorm'; import { fromArrayToUniqueKeyRecord, isDefined } from 'twenty-shared/utils'; import { FindManyOptions, FindOneOptions, Repository } from 'typeorm'; -import { v4 as uuidv4 } from 'uuid'; +import { v4 as uuidv4, v4 } from 'uuid'; import { ApplicationService } from 'src/engine/core-modules/application/services/application.service'; import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; -import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant'; import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; -import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; -import { MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; -import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; import { FlatNavigationMenuItem } from 'src/engine/metadata-modules/flat-navigation-menu-item/types/flat-navigation-menu-item.type'; import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; @@ -25,9 +22,6 @@ import { fromCreateObjectInputToFlatObjectMetadataAndFlatFieldMetadatasToCreate import { fromDeleteObjectInputToFlatFieldMetadatasToDelete } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-delete-object-input-to-flat-field-metadatas-to-delete.util'; import { fromUpdateObjectInputToFlatObjectMetadataAndRelatedFlatEntities } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-update-object-input-to-flat-object-metadata-and-related-flat-entities.util'; import { DEFAULT_VIEW_FIELD_SIZE } from 'src/engine/metadata-modules/flat-view-field/constants/default-view-field-size.constant'; -import { fromCreateViewFieldInputToFlatViewFieldToCreate } from 'src/engine/metadata-modules/flat-view-field/utils/from-create-view-field-input-to-flat-view-field-to-create.util'; -import { FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; -import { fromCreateViewInputToFlatViewToCreate } from 'src/engine/metadata-modules/flat-view/utils/from-create-view-input-to-flat-view-to-create.util'; import { CreateObjectInput } from 'src/engine/metadata-modules/object-metadata/dtos/create-object.input'; import { DeleteOneObjectInput } from 'src/engine/metadata-modules/object-metadata/dtos/delete-object.input'; import { UpdateOneObjectInput } from 'src/engine/metadata-modules/object-metadata/dtos/update-object.input'; @@ -37,12 +31,18 @@ import { ObjectMetadataExceptionCode, } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; import { ViewKey } from 'src/engine/metadata-modules/view/enums/view-key.enum'; +import { ViewOpenRecordIn } from 'src/engine/metadata-modules/view/enums/view-open-record-in'; import { ViewType } from 'src/engine/metadata-modules/view/enums/view-type.enum'; +import { ViewVisibility } from 'src/engine/metadata-modules/view/enums/view-visibility.enum'; import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; import { buildSystemAuthContext } from 'src/engine/twenty-orm/utils/build-system-auth-context.util'; import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service'; import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration/services/workspace-migration-validate-build-and-run-service'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; +import { UniversalFlatViewField } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-field.type'; +import { type UniversalFlatView } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view.type'; import { FavoriteWorkspaceEntity } from 'src/modules/favorite/standard-objects/favorite.workspace-entity'; @Injectable() @@ -162,8 +162,8 @@ export class ObjectMetadataService extends TypeOrmQueryService; - flatObjectMetadatasToDeleteById: Record; - flatIndexToDeleteById: Record; + flatFieldMetadatasToDeleteByUniversalIdentifier: Record< + string, + UniversalFlatFieldMetadata + >; + flatObjectMetadatasToDeleteByUniversalIdentifier: Record< + string, + UniversalFlatObjectMetadata + >; + flatIndexToDeleteByUniversalIdentifier: Record; } = { - flatFieldMetadatasToDeleteById: {}, - flatIndexToDeleteById: {}, - flatObjectMetadatasToDeleteById: {}, + flatFieldMetadatasToDeleteByUniversalIdentifier: {}, + flatIndexToDeleteByUniversalIdentifier: {}, + flatObjectMetadatasToDeleteByUniversalIdentifier: {}, }; const { - flatFieldMetadatasToDeleteById, - flatIndexToDeleteById, - flatObjectMetadatasToDeleteById, + flatFieldMetadatasToDeleteByUniversalIdentifier, + flatIndexToDeleteByUniversalIdentifier, + flatObjectMetadatasToDeleteByUniversalIdentifier, } = deleteObjectInputs.reduce((accumulator, deleteObjectInput) => { const { flatFieldMetadatasToDelete, @@ -275,23 +281,24 @@ export class ObjectMetadataService extends TypeOrmQueryService + findFlatEntityByUniversalIdentifierOrThrow({ + universalIdentifier: flatObjectMetadataToDelete.universalIdentifier, + flatEntityMaps: flatObjectMetadataMaps, + }), + ); + const validateAndBuildResult = await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { @@ -342,7 +359,7 @@ export class ObjectMetadataService extends TypeOrmQueryService>( - (flatEntityMaps, flatFieldMetadata) => - addFlatEntityToFlatEntityMapsOrThrow({ - flatEntity: flatFieldMetadata, - flatEntityMaps, - }), - createEmptyFlatEntityMaps(), - ); - - const optimisticFlatObjectMetadataMaps = - addFlatEntityToFlatEntityMapsOrThrow({ - flatEntity: flatObjectMetadataToCreate, - flatEntityMaps: createEmptyFlatEntityMaps(), - }); - - const flatDefaultViewToCreate = await this.computeFlatViewToCreate({ + const flatDefaultViewToCreate = this.computeFlatViewToCreate({ objectMetadata: flatObjectMetadataToCreate, - workspaceId, flatApplication: resolvedOwnerFlatApplication, - flatFieldMetadataMaps: optimisticFlatFieldMetadataMaps, - flatObjectMetadataMaps: optimisticFlatObjectMetadataMaps, - }); - - const optimisticFlatViewMaps = addFlatEntityToFlatEntityMapsOrThrow({ - flatEntity: flatDefaultViewToCreate, - flatEntityMaps: createEmptyFlatEntityMaps(), }); const flatDefaultViewFieldsToCreate = await this.computeFlatViewFieldsToCreate({ flatApplication: workspaceCustomFlatApplication, objectFlatFieldMetadatas: flatFieldMetadataToCreateOnObject, - viewId: flatDefaultViewToCreate.id, - workspaceId, - labelIdentifierFieldMetadataId: - flatObjectMetadataToCreate.labelIdentifierFieldMetadataId, - flatFieldMetadataMaps: optimisticFlatFieldMetadataMaps, - flatViewMaps: optimisticFlatViewMaps, + labelIdentifierFieldMetadataUniversalIdentifier: + flatObjectMetadataToCreate.labelIdentifierFieldMetadataUniversalIdentifier, + viewUniversalIdentifier: flatDefaultViewToCreate.universalIdentifier, }); const isNavigationMenuItemEnabled = @@ -528,78 +515,81 @@ export class ObjectMetadataService extends TypeOrmQueryService field.name !== 'deletedAt' && // Include 'id' only if it's the label identifier (e.g., for junction tables) - (field.name !== 'id' || field.id === labelIdentifierFieldMetadataId), + (field.name !== 'id' || + field.universalIdentifier === + labelIdentifierFieldMetadataUniversalIdentifier), ) - .map((field, index) => - fromCreateViewFieldInputToFlatViewFieldToCreate({ - createViewFieldInput: { - fieldMetadataId: field.id, - position: index, - isVisible: true, - size: DEFAULT_VIEW_FIELD_SIZE, - viewId: viewId, - }, - flatApplication, - workspaceId: workspaceId, - flatFieldMetadataMaps, - flatViewMaps, - }), - ); + .map((field, index) => ({ + fieldMetadataUniversalIdentifier: field.universalIdentifier, + viewUniversalIdentifier, + createdAt, + updatedAt: createdAt, + deletedAt: null, + universalIdentifier: v4(), + isVisible: true, + size: DEFAULT_VIEW_FIELD_SIZE, + position: index, + aggregateOperation: null, + applicationUniversalIdentifier: flatApplication.universalIdentifier, + })); return defaultViewFields; } @@ -610,7 +600,7 @@ export class ObjectMetadataService extends TypeOrmQueryService + flatObjectMetadata: Pick< + UniversalFlatObjectMetadata, + 'universalIdentifier' | 'applicationUniversalIdentifier' >; skipNameField?: boolean; }; @@ -28,29 +21,19 @@ export type DefaultFlatFieldForCustomObjectMaps = ReturnType< >; // This could be replaced totally by an import schema + its transpilation when it's ready export const buildDefaultFlatFieldMetadatasForCustomObject = ({ - workspaceId, flatObjectMetadata: { - id: objectMetadataId, - applicationId, applicationUniversalIdentifier, universalIdentifier: objectMetadataUniversalIdentifier, }, skipNameField = false, }: BuildDefaultFlatFieldMetadataForCustomObjectArgs) => { const createdAt = new Date().toISOString(); - const idFieldId = v4(); - const idField: FlatFieldMetadata = { + + const idField: UniversalFlatFieldMetadata = { type: FieldMetadataType.UUID, - id: idFieldId, - viewFieldIds: [], - kanbanAggregateOperationViewIds: [], - calendarViewIds: [], - mainGroupByFieldMetadataViewIds: [], isLabelSyncedWithName: false, isUnique: true, - objectMetadataId, - universalIdentifier: idFieldId, - workspaceId, + universalIdentifier: v4(), name: 'id', label: 'Id', icon: 'Icon123', @@ -61,17 +44,11 @@ export const buildDefaultFlatFieldMetadatasForCustomObject = ({ isSystem: true, isUIReadOnly: true, defaultValue: 'uuid', - viewFilterIds: [], - createdAt, updatedAt: createdAt, options: null, standardOverrides: null, - relationTargetFieldMetadataId: null, - relationTargetObjectMetadataId: null, - settings: null, morphId: null, - applicationId, applicationUniversalIdentifier, objectMetadataUniversalIdentifier, relationTargetObjectMetadataUniversalIdentifier: null, @@ -84,22 +61,14 @@ export const buildDefaultFlatFieldMetadatasForCustomObject = ({ universalSettings: null, }; - const nameFieldId = skipNameField ? null : v4(); - const nameField: FlatFieldMetadata | null = + const nameField: UniversalFlatFieldMetadata | null = skipNameField ? null : { type: FieldMetadataType.TEXT, - id: nameFieldId!, - viewFieldIds: [], - mainGroupByFieldMetadataViewIds: [], - kanbanAggregateOperationViewIds: [], - calendarViewIds: [], isLabelSyncedWithName: false, isUnique: false, - objectMetadataId, - universalIdentifier: nameFieldId!, - workspaceId, + universalIdentifier: v4(), name: 'name', label: 'Name', icon: 'IconAbc', @@ -110,17 +79,11 @@ export const buildDefaultFlatFieldMetadatasForCustomObject = ({ isSystem: false, isUIReadOnly: false, defaultValue: null, - viewFilterIds: [], - createdAt, updatedAt: createdAt, options: null, standardOverrides: null, - relationTargetFieldMetadataId: null, - relationTargetObjectMetadataId: null, - settings: null, morphId: null, - applicationId, applicationUniversalIdentifier, objectMetadataUniversalIdentifier, relationTargetObjectMetadataUniversalIdentifier: null, @@ -133,157 +96,110 @@ export const buildDefaultFlatFieldMetadatasForCustomObject = ({ universalSettings: null, }; - const createdAtFieldId = v4(); - const createdAtField: FlatFieldMetadata = { - type: FieldMetadataType.DATE_TIME, - id: createdAtFieldId, - viewFieldIds: [], - mainGroupByFieldMetadataViewIds: [], - kanbanAggregateOperationViewIds: [], - calendarViewIds: [], - isLabelSyncedWithName: false, - isUnique: false, - objectMetadataId, - universalIdentifier: createdAtFieldId, - workspaceId, - name: 'createdAt', - label: 'Creation date', - icon: 'IconCalendar', - description: 'Creation date', - isNullable: false, - isActive: true, - isCustom: false, - isSystem: false, - isUIReadOnly: true, - defaultValue: 'now', - viewFilterIds: [], + const createdAtField: UniversalFlatFieldMetadata = + { + type: FieldMetadataType.DATE_TIME, + isLabelSyncedWithName: false, + isUnique: false, + universalIdentifier: v4(), + name: 'createdAt', + label: 'Creation date', + icon: 'IconCalendar', + description: 'Creation date', + isNullable: false, + isActive: true, + isCustom: false, + isSystem: false, + isUIReadOnly: true, + defaultValue: 'now', + createdAt, + updatedAt: createdAt, + options: null, + standardOverrides: null, + morphId: null, + applicationUniversalIdentifier, + objectMetadataUniversalIdentifier, + relationTargetObjectMetadataUniversalIdentifier: null, + relationTargetFieldMetadataUniversalIdentifier: null, + viewFilterUniversalIdentifiers: [], + viewFieldUniversalIdentifiers: [], + kanbanAggregateOperationViewUniversalIdentifiers: [], + calendarViewUniversalIdentifiers: [], + mainGroupByFieldMetadataViewUniversalIdentifiers: [], + universalSettings: null, + }; - createdAt, - updatedAt: createdAt, - options: null, - standardOverrides: null, - relationTargetFieldMetadataId: null, - relationTargetObjectMetadataId: null, - settings: null, - morphId: null, - applicationId, - applicationUniversalIdentifier, - objectMetadataUniversalIdentifier, - relationTargetObjectMetadataUniversalIdentifier: null, - relationTargetFieldMetadataUniversalIdentifier: null, - viewFilterUniversalIdentifiers: [], - viewFieldUniversalIdentifiers: [], - kanbanAggregateOperationViewUniversalIdentifiers: [], - calendarViewUniversalIdentifiers: [], - mainGroupByFieldMetadataViewUniversalIdentifiers: [], - universalSettings: null, - }; + const updatedAtField: UniversalFlatFieldMetadata = + { + type: FieldMetadataType.DATE_TIME, + isLabelSyncedWithName: false, + isUnique: false, + universalIdentifier: v4(), + name: 'updatedAt', + label: 'Last update', + icon: 'IconCalendarClock', + description: 'Last time the record was changed', + isNullable: false, + isActive: true, + isCustom: false, + isSystem: false, + isUIReadOnly: true, + defaultValue: 'now', + createdAt, + updatedAt: createdAt, + options: null, + standardOverrides: null, + morphId: null, + applicationUniversalIdentifier, + objectMetadataUniversalIdentifier, + relationTargetObjectMetadataUniversalIdentifier: null, + relationTargetFieldMetadataUniversalIdentifier: null, + viewFilterUniversalIdentifiers: [], + viewFieldUniversalIdentifiers: [], + kanbanAggregateOperationViewUniversalIdentifiers: [], + calendarViewUniversalIdentifiers: [], + mainGroupByFieldMetadataViewUniversalIdentifiers: [], + universalSettings: null, + }; - const updatedAtFieldId = v4(); - const updatedAtField: FlatFieldMetadata = { - type: FieldMetadataType.DATE_TIME, - id: updatedAtFieldId, - viewFieldIds: [], - mainGroupByFieldMetadataViewIds: [], - kanbanAggregateOperationViewIds: [], - calendarViewIds: [], - isLabelSyncedWithName: false, - isUnique: false, - objectMetadataId, - universalIdentifier: updatedAtFieldId, - workspaceId, - name: 'updatedAt', - label: 'Last update', - icon: 'IconCalendarClock', - description: 'Last time the record was changed', - isNullable: false, - isActive: true, - isCustom: false, - isSystem: false, - isUIReadOnly: true, - defaultValue: 'now', - viewFilterIds: [], + const deletedAtField: UniversalFlatFieldMetadata = + { + type: FieldMetadataType.DATE_TIME, + isLabelSyncedWithName: false, + isUnique: false, + universalIdentifier: v4(), + name: 'deletedAt', + label: 'Deleted at', + icon: 'IconCalendarClock', + description: 'Deletion date', + isNullable: true, + isActive: true, + isCustom: false, + isSystem: false, + isUIReadOnly: true, + defaultValue: null, + createdAt, + updatedAt: createdAt, + options: null, + standardOverrides: null, + morphId: null, + applicationUniversalIdentifier, + objectMetadataUniversalIdentifier, + relationTargetObjectMetadataUniversalIdentifier: null, + relationTargetFieldMetadataUniversalIdentifier: null, + viewFilterUniversalIdentifiers: [], + viewFieldUniversalIdentifiers: [], + kanbanAggregateOperationViewUniversalIdentifiers: [], + calendarViewUniversalIdentifiers: [], + mainGroupByFieldMetadataViewUniversalIdentifiers: [], + universalSettings: null, + }; - createdAt, - updatedAt: createdAt, - options: null, - standardOverrides: null, - relationTargetFieldMetadataId: null, - relationTargetObjectMetadataId: null, - settings: null, - morphId: null, - applicationId, - applicationUniversalIdentifier, - objectMetadataUniversalIdentifier, - relationTargetObjectMetadataUniversalIdentifier: null, - relationTargetFieldMetadataUniversalIdentifier: null, - viewFilterUniversalIdentifiers: [], - viewFieldUniversalIdentifiers: [], - kanbanAggregateOperationViewUniversalIdentifiers: [], - calendarViewUniversalIdentifiers: [], - mainGroupByFieldMetadataViewUniversalIdentifiers: [], - universalSettings: null, - }; - - const deletedAtFieldId = v4(); - const deletedAtField: FlatFieldMetadata = { - type: FieldMetadataType.DATE_TIME, - id: deletedAtFieldId, - viewFieldIds: [], - mainGroupByFieldMetadataViewIds: [], - kanbanAggregateOperationViewIds: [], - calendarViewIds: [], - isLabelSyncedWithName: false, - isUnique: false, - objectMetadataId, - universalIdentifier: deletedAtFieldId, - workspaceId, - name: 'deletedAt', - label: 'Deleted at', - icon: 'IconCalendarClock', - description: 'Deletion date', - isNullable: true, - isActive: true, - isCustom: false, - isSystem: false, - isUIReadOnly: true, - defaultValue: null, - viewFilterIds: [], - - createdAt, - updatedAt: createdAt, - options: null, - standardOverrides: null, - relationTargetFieldMetadataId: null, - relationTargetObjectMetadataId: null, - settings: null, - morphId: null, - applicationId, - applicationUniversalIdentifier, - objectMetadataUniversalIdentifier, - relationTargetObjectMetadataUniversalIdentifier: null, - relationTargetFieldMetadataUniversalIdentifier: null, - viewFilterUniversalIdentifiers: [], - viewFieldUniversalIdentifiers: [], - kanbanAggregateOperationViewUniversalIdentifiers: [], - calendarViewUniversalIdentifiers: [], - mainGroupByFieldMetadataViewUniversalIdentifiers: [], - universalSettings: null, - }; - - const createdByFieldId = v4(); - const createdByField: FlatFieldMetadata = { + const createdByField: UniversalFlatFieldMetadata = { type: FieldMetadataType.ACTOR, - id: createdByFieldId, - viewFieldIds: [], - mainGroupByFieldMetadataViewIds: [], - kanbanAggregateOperationViewIds: [], - calendarViewIds: [], isLabelSyncedWithName: false, isUnique: false, - objectMetadataId, - universalIdentifier: createdByFieldId, - workspaceId, + universalIdentifier: v4(), name: 'createdBy', label: 'Created by', icon: 'IconCreativeCommonsSa', @@ -294,16 +210,11 @@ export const buildDefaultFlatFieldMetadatasForCustomObject = ({ isSystem: false, isUIReadOnly: true, defaultValue: { name: "''", source: "'MANUAL'" }, - viewFilterIds: [], createdAt, updatedAt: createdAt, options: null, standardOverrides: null, - relationTargetFieldMetadataId: null, - relationTargetObjectMetadataId: null, - settings: null, morphId: null, - applicationId, applicationUniversalIdentifier, objectMetadataUniversalIdentifier, relationTargetObjectMetadataUniversalIdentifier: null, @@ -316,19 +227,11 @@ export const buildDefaultFlatFieldMetadatasForCustomObject = ({ universalSettings: null, }; - const updatedByFieldId = v4(); - const updatedByField: FlatFieldMetadata = { + const updatedByField: UniversalFlatFieldMetadata = { type: FieldMetadataType.ACTOR, - id: updatedByFieldId, - viewFieldIds: [], - mainGroupByFieldMetadataViewIds: [], - kanbanAggregateOperationViewIds: [], - calendarViewIds: [], isLabelSyncedWithName: false, isUnique: false, - objectMetadataId, - universalIdentifier: updatedByFieldId, - workspaceId, + universalIdentifier: v4(), name: 'updatedBy', label: 'Updated by', icon: 'IconUserCircle', @@ -339,16 +242,11 @@ export const buildDefaultFlatFieldMetadatasForCustomObject = ({ isSystem: false, isUIReadOnly: true, defaultValue: { name: "''", source: "'MANUAL'" }, - viewFilterIds: [], createdAt, updatedAt: createdAt, options: null, standardOverrides: null, - relationTargetFieldMetadataId: null, - relationTargetObjectMetadataId: null, - settings: null, morphId: null, - applicationId, applicationUniversalIdentifier, objectMetadataUniversalIdentifier, relationTargetObjectMetadataUniversalIdentifier: null, @@ -361,103 +259,77 @@ export const buildDefaultFlatFieldMetadatasForCustomObject = ({ universalSettings: null, }; - const positionFieldId = v4(); - const positionField: FlatFieldMetadata = { - type: FieldMetadataType.POSITION, - id: positionFieldId, - viewFieldIds: [], - mainGroupByFieldMetadataViewIds: [], - kanbanAggregateOperationViewIds: [], - calendarViewIds: [], - isLabelSyncedWithName: false, - isUnique: false, - objectMetadataId, - universalIdentifier: positionFieldId, - workspaceId, - name: 'position', - label: 'Position', - icon: 'IconHierarchy2', - description: 'Position', - isNullable: false, - isActive: true, - isCustom: false, - isSystem: true, - isUIReadOnly: true, - defaultValue: 0, - viewFilterIds: [], + const positionField: UniversalFlatFieldMetadata = + { + type: FieldMetadataType.POSITION, + isLabelSyncedWithName: false, + isUnique: false, + universalIdentifier: v4(), + name: 'position', + label: 'Position', + icon: 'IconHierarchy2', + description: 'Position', + isNullable: false, + isActive: true, + isCustom: false, + isSystem: true, + isUIReadOnly: true, + defaultValue: 0, + createdAt, + updatedAt: createdAt, + options: null, + standardOverrides: null, + morphId: null, + applicationUniversalIdentifier, + objectMetadataUniversalIdentifier, + relationTargetObjectMetadataUniversalIdentifier: null, + relationTargetFieldMetadataUniversalIdentifier: null, + viewFilterUniversalIdentifiers: [], + viewFieldUniversalIdentifiers: [], + kanbanAggregateOperationViewUniversalIdentifiers: [], + calendarViewUniversalIdentifiers: [], + mainGroupByFieldMetadataViewUniversalIdentifiers: [], + universalSettings: null, + }; - createdAt, - updatedAt: createdAt, - options: null, - standardOverrides: null, - relationTargetFieldMetadataId: null, - relationTargetObjectMetadataId: null, - settings: null, - morphId: null, - applicationId, - applicationUniversalIdentifier, - objectMetadataUniversalIdentifier, - relationTargetObjectMetadataUniversalIdentifier: null, - relationTargetFieldMetadataUniversalIdentifier: null, - viewFilterUniversalIdentifiers: [], - viewFieldUniversalIdentifiers: [], - kanbanAggregateOperationViewUniversalIdentifiers: [], - calendarViewUniversalIdentifiers: [], - mainGroupByFieldMetadataViewUniversalIdentifiers: [], - universalSettings: null, - }; - - const searchVectorFieldId = v4(); const searchVectorSettings: FieldMetadataSettingsMapping['TS_VECTOR'] = { asExpression: getTsVectorColumnExpressionFromFields( nameField ? [nameField] : [], ), generatedType: 'STORED', }; - const searchVectorField: FlatFieldMetadata = { - type: FieldMetadataType.TS_VECTOR, - mainGroupByFieldMetadataViewIds: [], - viewFieldIds: [], - kanbanAggregateOperationViewIds: [], - calendarViewIds: [], - id: searchVectorFieldId, - isLabelSyncedWithName: false, - isUnique: false, - objectMetadataId, - universalIdentifier: searchVectorFieldId, - workspaceId, - name: 'searchVector', - label: 'Search vector', - icon: 'IconSearch', - description: 'Search vector', - isNullable: true, - isActive: true, - isCustom: false, - isSystem: true, - isUIReadOnly: true, - defaultValue: null, - viewFilterIds: [], - - createdAt, - updatedAt: createdAt, - options: null, - standardOverrides: null, - relationTargetFieldMetadataId: null, - relationTargetObjectMetadataId: null, - settings: searchVectorSettings, - morphId: null, - applicationId, - applicationUniversalIdentifier, - objectMetadataUniversalIdentifier, - relationTargetObjectMetadataUniversalIdentifier: null, - relationTargetFieldMetadataUniversalIdentifier: null, - viewFilterUniversalIdentifiers: [], - viewFieldUniversalIdentifiers: [], - kanbanAggregateOperationViewUniversalIdentifiers: [], - calendarViewUniversalIdentifiers: [], - mainGroupByFieldMetadataViewUniversalIdentifiers: [], - universalSettings: searchVectorSettings, - }; + const searchVectorField: UniversalFlatFieldMetadata = + { + type: FieldMetadataType.TS_VECTOR, + isLabelSyncedWithName: false, + isUnique: false, + universalIdentifier: v4(), + name: 'searchVector', + label: 'Search vector', + icon: 'IconSearch', + description: 'Search vector', + isNullable: true, + isActive: true, + isCustom: false, + isSystem: true, + isUIReadOnly: true, + defaultValue: null, + createdAt, + updatedAt: createdAt, + options: null, + standardOverrides: null, + morphId: null, + applicationUniversalIdentifier, + objectMetadataUniversalIdentifier, + relationTargetObjectMetadataUniversalIdentifier: null, + relationTargetFieldMetadataUniversalIdentifier: null, + viewFilterUniversalIdentifiers: [], + viewFieldUniversalIdentifiers: [], + kanbanAggregateOperationViewUniversalIdentifiers: [], + calendarViewUniversalIdentifiers: [], + mainGroupByFieldMetadataViewUniversalIdentifiers: [], + universalSettings: searchVectorSettings, + }; return { fields: { @@ -472,6 +344,6 @@ export const buildDefaultFlatFieldMetadatasForCustomObject = ({ searchVectorField, }, } as const satisfies { - fields: Record; + fields: Record; }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-index-for-custom-object.util.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-index-for-custom-object.util.ts index 6c11ef1192..a6dedb1b61 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-index-for-custom-object.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-index-for-custom-object.util.ts @@ -1,51 +1,47 @@ import { v4 } from 'uuid'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { IndexType } from 'src/engine/metadata-modules/index-metadata/types/indexType.types'; import { generateFlatIndexMetadataWithNameOrThrow } from 'src/engine/metadata-modules/index-metadata/utils/generate-flat-index.util'; import { type DefaultFlatFieldForCustomObjectMaps } from 'src/engine/metadata-modules/object-metadata/utils/build-default-flat-field-metadatas-for-custom-object.util'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; export const buildDefaultIndexesForCustomObject = ({ - workspaceId, flatObjectMetadata, defaultFlatFieldForCustomObjectMaps, objectFlatFieldMetadatas, }: { - workspaceId: string; - flatObjectMetadata: FlatObjectMetadata; - objectFlatFieldMetadatas: FlatFieldMetadata[]; + flatObjectMetadata: UniversalFlatObjectMetadata & { id: string }; + objectFlatFieldMetadatas: UniversalFlatFieldMetadata[]; defaultFlatFieldForCustomObjectMaps: DefaultFlatFieldForCustomObjectMaps; }) => { - const tsFlatVectorIndexId = v4(); + const tsFlatVectorIndexUniversalIdentifier = v4(); const createdAt = new Date(); const tsVectorFlatIndex = generateFlatIndexMetadataWithNameOrThrow({ objectFlatFieldMetadatas, flatIndex: { createdAt: createdAt.toISOString(), - flatIndexFieldMetadatas: [ + universalFlatIndexFieldMetadatas: [ { createdAt: createdAt.toISOString(), - fieldMetadataId: - defaultFlatFieldForCustomObjectMaps.fields.searchVectorField.id, - id: v4(), - indexMetadataId: tsFlatVectorIndexId, + fieldMetadataUniversalIdentifier: + defaultFlatFieldForCustomObjectMaps.fields.searchVectorField + .universalIdentifier, + indexMetadataUniversalIdentifier: + tsFlatVectorIndexUniversalIdentifier, order: 0, updatedAt: createdAt.toISOString(), }, ], - id: tsFlatVectorIndexId, + indexType: IndexType.GIN, indexWhereClause: null, isCustom: false, isUnique: false, - objectMetadataId: flatObjectMetadata.id, objectMetadataUniversalIdentifier: flatObjectMetadata.universalIdentifier, - universalIdentifier: tsFlatVectorIndexId, + universalIdentifier: tsFlatVectorIndexUniversalIdentifier, updatedAt: createdAt.toISOString(), - workspaceId, - applicationId: flatObjectMetadata.applicationId, applicationUniversalIdentifier: flatObjectMetadata.applicationUniversalIdentifier, }, @@ -56,5 +52,5 @@ export const buildDefaultIndexesForCustomObject = ({ indexes: { tsVectorFlatIndex, }, - } as const satisfies { indexes: Record }; + } as const satisfies { indexes: Record }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-relation-flat-field-metadatas-for-custom-object.util.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-relation-flat-field-metadatas-for-custom-object.util.ts index 0fb92f0bc5..20f975fcd3 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-relation-flat-field-metadatas-for-custom-object.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-relation-flat-field-metadatas-for-custom-object.util.ts @@ -1,6 +1,6 @@ +import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { FieldMetadataType } from 'twenty-shared/types'; import { capitalize, isDefined } from 'twenty-shared/utils'; -import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { type FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; @@ -10,7 +10,6 @@ import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/featu import { computeMorphOrRelationFieldJoinColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-morph-or-relation-field-join-column-name.util'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { generateMorphOrRelationFlatFieldMetadataPair } from 'src/engine/metadata-modules/flat-field-metadata/utils/generate-morph-or-relation-flat-field-metadata-pair.util'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { @@ -18,6 +17,8 @@ import { ObjectMetadataExceptionCode, } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; import { STANDARD_OBJECT_ICONS } from 'src/engine/workspace-manager/workspace-migration/constant/standard-object-icons'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; const DEFAULT_RELATIONS_OBJECTS_STANDARD_IDS = [ 'timelineActivity', @@ -48,14 +49,13 @@ const DEFAULT_MORPH_RELATIONS_OBJECTS_STANDARD_IDS = export type BuildDefaultRelationFieldsForCustomObjectArgs = { existingFeatureFlagsMap: FeatureFlagMap; existingFlatObjectMetadataMaps: FlatEntityMaps; - workspaceId: string; - sourceFlatObjectMetadata: FlatObjectMetadata; + sourceFlatObjectMetadata: UniversalFlatObjectMetadata; flatApplication: FlatApplication; }; type SourceAndTargetFlatFieldMetadatasRecord = { - standardSourceFlatFieldMetadatas: FlatFieldMetadata[]; - standardTargetFlatFieldMetadatas: FlatFieldMetadata[]; + standardSourceFlatFieldMetadatas: UniversalFlatFieldMetadata[]; + standardTargetFlatFieldMetadatas: UniversalFlatFieldMetadata[]; }; const EMPTY_SOURCE_AND_TARGET_FLAT_FIELD_METADATAS_RECORD: SourceAndTargetFlatFieldMetadatasRecord = { @@ -67,7 +67,6 @@ export const buildDefaultRelationFlatFieldMetadatasForCustomObject = ({ existingFeatureFlagsMap, existingFlatObjectMetadataMaps, sourceFlatObjectMetadata, - workspaceId, flatApplication, }: BuildDefaultRelationFieldsForCustomObjectArgs): SourceAndTargetFlatFieldMetadatasRecord => { const objectIdByNameSingular = Object.values( @@ -144,7 +143,6 @@ export const buildDefaultRelationFlatFieldMetadatasForCustomObject = ({ targetFlatFieldMetadataType: isObjectMigratedToMorphRelations ? FieldMetadataType.MORPH_RELATION : FieldMetadataType.RELATION, - workspaceId, flatApplication, sourceFlatObjectMetadataJoinColumnName: joinColumnName, morphId, @@ -154,7 +152,6 @@ export const buildDefaultRelationFlatFieldMetadatasForCustomObject = ({ type: FieldMetadataType.RELATION, name: targetFlatObjectMetadata.namePlural, label: capitalize(targetFlatObjectMetadata.labelPlural), - objectMetadataId: sourceFlatObjectMetadata.id, isSystem: true, relationCreationPayload: { type: RelationType.ONE_TO_MANY, diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/services/page-layout-widget.service.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/services/page-layout-widget.service.ts index ab328cedf4..502ca71d9c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/services/page-layout-widget.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/services/page-layout-widget.service.ts @@ -157,11 +157,19 @@ export class PageLayoutWidgetService { { workspaceId }, ); - const { flatPageLayoutTabMaps, flatObjectMetadataMaps } = + const { + flatPageLayoutTabMaps, + flatObjectMetadataMaps, + flatFieldMetadataMaps, + } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { workspaceId, - flatMapsKeys: ['flatPageLayoutTabMaps', 'flatObjectMetadataMaps'], + flatMapsKeys: [ + 'flatPageLayoutTabMaps', + 'flatObjectMetadataMaps', + 'flatFieldMetadataMaps', + ], }, ); @@ -172,6 +180,7 @@ export class PageLayoutWidgetService { flatApplication: workspaceCustomFlatApplication, flatPageLayoutTabMaps, flatObjectMetadataMaps, + flatFieldMetadataMaps, }); await this.validateAndRunWidgetMigration({ @@ -213,11 +222,14 @@ export class PageLayoutWidgetService { const existingFlatPageLayoutWidgetMaps = await this.getFlatPageLayoutWidgetMaps(workspaceId); - const { flatObjectMetadataMaps: existingFlatObjectMetadataMaps } = + const { + flatObjectMetadataMaps: existingFlatObjectMetadataMaps, + flatFieldMetadataMaps: existingFlatFieldMetadataMaps, + } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { workspaceId, - flatMapsKeys: ['flatObjectMetadataMaps'], + flatMapsKeys: ['flatObjectMetadataMaps', 'flatFieldMetadataMaps'], }, ); @@ -235,6 +247,7 @@ export class PageLayoutWidgetService { updatePageLayoutWidgetInput, flatPageLayoutWidgetMaps: existingFlatPageLayoutWidgetMaps, flatObjectMetadataMaps: existingFlatObjectMetadataMaps, + flatFieldMetadataMaps: existingFlatFieldMetadataMaps, }); await this.validateAndRunWidgetMigration({ diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout-duplication.service.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout-duplication.service.ts index 5438098520..13ddd7cb33 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout-duplication.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout-duplication.service.ts @@ -51,6 +51,7 @@ export class PageLayoutDuplicationService { flatPageLayoutTabMaps, flatPageLayoutWidgetMaps, flatObjectMetadataMaps, + flatFieldMetadataMaps, } = await this.getPageLayoutFlatEntityMaps(workspaceId); const originalFlatLayout = this.findOriginalLayoutOrThrow( @@ -112,6 +113,7 @@ export class PageLayoutDuplicationService { flatApplication: workspaceCustomFlatApplication, flatPageLayoutTabMaps: optimisticFlatPageLayoutTabMaps, flatObjectMetadataMaps, + flatFieldMetadataMaps, }); const validateAndBuildResult = @@ -178,6 +180,7 @@ export class PageLayoutDuplicationService { 'flatPageLayoutTabMaps', 'flatPageLayoutWidgetMaps', 'flatObjectMetadataMaps', + 'flatFieldMetadataMaps', ], }, ); @@ -286,6 +289,7 @@ export class PageLayoutDuplicationService { flatApplication, flatPageLayoutTabMaps, flatObjectMetadataMaps, + flatFieldMetadataMaps, }: { originalTabsWithWidgets: { tab: FlatPageLayoutTab; @@ -296,6 +300,7 @@ export class PageLayoutDuplicationService { flatApplication: FlatApplication; flatPageLayoutTabMaps: AllFlatEntityMaps['flatPageLayoutTabMaps']; flatObjectMetadataMaps: AllFlatEntityMaps['flatObjectMetadataMaps']; + flatFieldMetadataMaps: AllFlatEntityMaps['flatFieldMetadataMaps']; }): FlatPageLayoutWidget[] { return originalTabsWithWidgets.flatMap(({ tab, widgets }) => { const newTabId = originalTabIdToNewTabIdMap.get(tab.id)!; @@ -314,6 +319,7 @@ export class PageLayoutDuplicationService { flatApplication, flatPageLayoutTabMaps, flatObjectMetadataMaps, + flatFieldMetadataMaps, }), ); }); diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout-update.service.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout-update.service.ts index 1414e761d0..1591e7547e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout-update.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout-update.service.ts @@ -6,7 +6,7 @@ import { v4 } from 'uuid'; import { ApplicationService } from 'src/engine/core-modules/application/services/application.service'; import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; -import { MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; +import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { resolveEntityRelationUniversalIdentifiers } from 'src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util'; @@ -14,8 +14,8 @@ import { FLAT_PAGE_LAYOUT_TAB_EDITABLE_PROPERTIES } from 'src/engine/metadata-mo import { type FlatPageLayoutTabMaps } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab-maps.type'; import { type FlatPageLayoutTab } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab.type'; import { FLAT_PAGE_LAYOUT_WIDGET_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-page-layout-widget/constants/flat-page-layout-widget-editable-properties.constant'; -import { type FlatPageLayoutWidgetMaps } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget-maps.type'; import { type FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type'; +import { fromPageLayoutWidgetConfigurationToUniversalConfiguration } from 'src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-configuration-to-universal-configuration.util'; import { type FlatPageLayout } from 'src/engine/metadata-modules/flat-page-layout/types/flat-page-layout.type'; import { reconstructFlatPageLayoutWithTabsAndWidgets } from 'src/engine/metadata-modules/flat-page-layout/utils/reconstruct-flat-page-layout-with-tabs-and-widgets.util'; import { UpdatePageLayoutTabWithWidgetsInput } from 'src/engine/metadata-modules/page-layout-tab/dtos/inputs/update-page-layout-tab-with-widgets.input'; @@ -115,11 +115,11 @@ export class PageLayoutUpdateService { workspaceCustomFlatApplication.universalIdentifier, }); - const { flatObjectMetadataMaps } = + const { flatObjectMetadataMaps, flatFieldMetadataMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { workspaceId, - flatMapsKeys: ['flatObjectMetadataMaps'], + flatMapsKeys: ['flatObjectMetadataMaps', 'flatFieldMetadataMaps'], }, ); @@ -133,6 +133,7 @@ export class PageLayoutUpdateService { workspaceCustomApplicationId: workspaceCustomFlatApplication.id, workspaceCustomApplicationUniversalIdentifier: workspaceCustomFlatApplication.universalIdentifier, + flatFieldMetadataMaps, }); const validateAndBuildResult = @@ -343,15 +344,19 @@ export class PageLayoutUpdateService { workspaceId, workspaceCustomApplicationId, workspaceCustomApplicationUniversalIdentifier, + flatFieldMetadataMaps, }: { tabs: UpdatePageLayoutTabWithWidgetsInput[]; - flatPageLayoutWidgetMaps: FlatPageLayoutWidgetMaps; - flatPageLayoutTabMaps: FlatPageLayoutTabMaps; - flatObjectMetadataMaps: MetadataFlatEntityMaps<'objectMetadata'>; workspaceId: string; workspaceCustomApplicationId: string; workspaceCustomApplicationUniversalIdentifier: string; - }): { + } & Pick< + AllFlatEntityMaps, + | 'flatObjectMetadataMaps' + | 'flatFieldMetadataMaps' + | 'flatPageLayoutTabMaps' + | 'flatPageLayoutWidgetMaps' + >): { widgetsToCreate: FlatPageLayoutWidget[]; widgetsToUpdate: FlatPageLayoutWidget[]; widgetsToDelete: FlatPageLayoutWidget[]; @@ -370,6 +375,7 @@ export class PageLayoutUpdateService { workspaceId, workspaceCustomApplicationId, workspaceCustomApplicationUniversalIdentifier, + flatFieldMetadataMaps, }); allWidgetsToCreate.push(...widgetsToCreate); @@ -392,16 +398,20 @@ export class PageLayoutUpdateService { workspaceId, workspaceCustomApplicationId, workspaceCustomApplicationUniversalIdentifier, + flatFieldMetadataMaps, }: { tabId: string; widgets: UpdatePageLayoutWidgetWithIdInput[]; - flatPageLayoutWidgetMaps: FlatPageLayoutWidgetMaps; - flatPageLayoutTabMaps: FlatPageLayoutTabMaps; - flatObjectMetadataMaps: MetadataFlatEntityMaps<'objectMetadata'>; workspaceId: string; workspaceCustomApplicationId: string; workspaceCustomApplicationUniversalIdentifier: string; - }): { + } & Pick< + AllFlatEntityMaps, + | 'flatObjectMetadataMaps' + | 'flatFieldMetadataMaps' + | 'flatPageLayoutTabMaps' + | 'flatPageLayoutWidgetMaps' + >): { widgetsToCreate: FlatPageLayoutWidget[]; widgetsToUpdate: FlatPageLayoutWidget[]; } { @@ -426,7 +436,6 @@ export class PageLayoutUpdateService { }); const now = new Date(); - const widgetsToCreate: FlatPageLayoutWidget[] = entitiesToCreate.map( (widgetInput) => { const widgetId = widgetInput.id ?? v4(); @@ -456,7 +465,7 @@ export class PageLayoutUpdateService { objectMetadataUniversalIdentifier, gridPosition: widgetInput.gridPosition, position: widgetInput.position ?? null, - configuration: widgetInput.configuration ?? null, + configuration: widgetInput.configuration, workspaceId, createdAt: now.toISOString(), updatedAt: now.toISOString(), @@ -466,6 +475,13 @@ export class PageLayoutUpdateService { applicationUniversalIdentifier: workspaceCustomApplicationUniversalIdentifier, conditionalDisplay: null, + universalConfiguration: + fromPageLayoutWidgetConfigurationToUniversalConfiguration({ + configuration: widgetInput.configuration, + fieldMetadataUniversalIdentifierById: + flatFieldMetadataMaps.universalIdentifierById, + shouldThrowOnMissingIdentifier: true, + }), }; }, ); @@ -477,6 +493,8 @@ export class PageLayoutUpdateService { flatEntityMaps: flatPageLayoutWidgetMaps, }); + const updatedConfiguration = widgetInput.configuration ?? null; + return { ...existingWidget, pageLayoutTabId: widgetInput.pageLayoutTabId, @@ -485,8 +503,16 @@ export class PageLayoutUpdateService { objectMetadataId: widgetInput.objectMetadataId ?? null, gridPosition: widgetInput.gridPosition, position: widgetInput.position ?? null, - configuration: widgetInput.configuration ?? null, + configuration: updatedConfiguration, updatedAt: now.toISOString(), + ...(isDefined(updatedConfiguration) && { + universalConfiguration: + fromPageLayoutWidgetConfigurationToUniversalConfiguration({ + configuration: updatedConfiguration, + fieldMetadataUniversalIdentifierById: + flatFieldMetadataMaps.universalIdentifierById, + }), + }), }; }, ); @@ -498,6 +524,8 @@ export class PageLayoutUpdateService { flatEntityMaps: flatPageLayoutWidgetMaps, }); + const restoredConfiguration = widgetInput.configuration ?? null; + return { ...existingWidget, pageLayoutTabId: widgetInput.pageLayoutTabId, @@ -506,9 +534,17 @@ export class PageLayoutUpdateService { objectMetadataId: widgetInput.objectMetadataId ?? null, gridPosition: widgetInput.gridPosition, position: widgetInput.position ?? null, - configuration: widgetInput.configuration ?? null, + configuration: restoredConfiguration, deletedAt: null, updatedAt: now.toISOString(), + ...(isDefined(restoredConfiguration) && { + universalConfiguration: + fromPageLayoutWidgetConfigurationToUniversalConfiguration({ + configuration: restoredConfiguration, + fieldMetadataUniversalIdentifierById: + flatFieldMetadataMaps.universalIdentifierById, + }), + }), }; }); diff --git a/packages/twenty-server/src/engine/metadata-modules/skill/skill.service.ts b/packages/twenty-server/src/engine/metadata-modules/skill/skill.service.ts index 3c2a4b9d73..f7acff2257 100644 --- a/packages/twenty-server/src/engine/metadata-modules/skill/skill.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/skill/skill.service.ts @@ -7,7 +7,7 @@ import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadat import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { type FlatSkill } from 'src/engine/metadata-modules/flat-skill/types/flat-skill.type'; -import { fromCreateSkillInputToFlatSkillToCreate } from 'src/engine/metadata-modules/flat-skill/utils/from-create-skill-input-to-flat-skill-to-create.util'; +import { fromCreateSkillInputToUniversalFlatSkillToCreate } from 'src/engine/metadata-modules/flat-skill/utils/from-create-skill-input-to-flat-skill-to-create.util'; import { fromDeleteSkillInputToFlatSkillOrThrow } from 'src/engine/metadata-modules/flat-skill/utils/from-delete-skill-input-to-flat-skill-or-throw.util'; import { fromFlatSkillToSkillDto } from 'src/engine/metadata-modules/flat-skill/utils/from-flat-skill-to-skill-dto.util'; import { fromUpdateSkillInputToFlatSkillToUpdateOrThrow } from 'src/engine/metadata-modules/flat-skill/utils/from-update-skill-input-to-flat-skill-to-update-or-throw.util'; @@ -74,18 +74,18 @@ export class SkillService { { workspaceId }, ); - const flatSkillToCreate = fromCreateSkillInputToFlatSkillToCreate({ - createSkillInput: input, - workspaceId, - flatApplication: workspaceCustomFlatApplication, - }); + const universalFlatSkillToCreate = + fromCreateSkillInputToUniversalFlatSkillToCreate({ + createSkillInput: input, + flatApplication: workspaceCustomFlatApplication, + }); const validateAndBuildResult = await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { allFlatEntityOperationByMetadataName: { skill: { - flatEntityToCreate: [flatSkillToCreate], + flatEntityToCreate: [universalFlatSkillToCreate], flatEntityToDelete: [], flatEntityToUpdate: [], }, @@ -114,7 +114,7 @@ export class SkillService { return fromFlatSkillToSkillDto( findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: flatSkillToCreate.id, + flatEntityId: universalFlatSkillToCreate.id, flatEntityMaps: recomputedFlatSkillMaps, }), ); diff --git a/packages/twenty-server/src/engine/metadata-modules/view-field/services/view-field-v2.service.ts b/packages/twenty-server/src/engine/metadata-modules/view-field/services/view-field-v2.service.ts index f8327040d0..f27befe6b8 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-field/services/view-field-v2.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-field/services/view-field-v2.service.ts @@ -6,7 +6,7 @@ import { IsNull, Repository } from 'typeorm'; import { ApplicationService } from 'src/engine/core-modules/application/services/application.service'; import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; -import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { fromCreateViewFieldInputToFlatViewFieldToCreate } from 'src/engine/metadata-modules/flat-view-field/utils/from-create-view-field-input-to-flat-view-field-to-create.util'; import { fromDeleteViewFieldInputToFlatViewFieldOrThrow } from 'src/engine/metadata-modules/flat-view-field/utils/from-delete-view-field-input-to-flat-view-field-or-throw.util'; @@ -88,7 +88,6 @@ export class ViewFieldV2Service { (createViewFieldInput) => fromCreateViewFieldInputToFlatViewFieldToCreate({ createViewFieldInput, - workspaceId, flatApplication: workspaceCustomFlatApplication, flatFieldMetadataMaps, flatViewMaps, @@ -194,8 +193,8 @@ export class ViewFieldV2Service { ); return fromFlatViewFieldToViewFieldDto( - findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: optimisticallyUpdatedFlatView.id, + findFlatEntityByUniversalIdentifierOrThrow({ + universalIdentifier: optimisticallyUpdatedFlatView.universalIdentifier, flatEntityMaps: recomputedExistingFlatViewFieldMaps, }), ); @@ -262,8 +261,9 @@ export class ViewFieldV2Service { ); return fromFlatViewFieldToViewFieldDto( - findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: optimisticallyUpdatedFlatViewWithDeletedAt.id, + findFlatEntityByUniversalIdentifierOrThrow({ + universalIdentifier: + optimisticallyUpdatedFlatViewWithDeletedAt.universalIdentifier, flatEntityMaps: recomputedExistingFlatViewFieldMaps, }), ); @@ -297,6 +297,11 @@ export class ViewFieldV2Service { flatViewFieldMaps: existingFlatViewFieldMaps, }); + const existingFlatViewField = findFlatEntityByUniversalIdentifierOrThrow({ + universalIdentifier: existingViewFieldToDelete.universalIdentifier, + flatEntityMaps: existingFlatViewFieldMaps, + }); + const validateAndBuildResult = await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { @@ -321,7 +326,10 @@ export class ViewFieldV2Service { ); } - return fromFlatViewFieldToViewFieldDto(existingViewFieldToDelete); + return fromFlatViewFieldToViewFieldDto({ + ...existingFlatViewField, + deletedAt: new Date().toISOString(), + }); } async findByWorkspaceId(workspaceId: string): Promise { diff --git a/packages/twenty-server/src/engine/metadata-modules/view-filter-group/services/view-filter-group.service.ts b/packages/twenty-server/src/engine/metadata-modules/view-filter-group/services/view-filter-group.service.ts index 0551e31d39..386b7162ee 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-filter-group/services/view-filter-group.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-filter-group/services/view-filter-group.service.ts @@ -7,6 +7,7 @@ import { IsNull, type Repository } from 'typeorm'; import { ApplicationService } from 'src/engine/core-modules/application/services/application.service'; import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { fromCreateViewFilterGroupInputToFlatViewFilterGroupToCreate } from 'src/engine/metadata-modules/flat-view-filter-group/utils/from-create-view-filter-group-input-to-flat-view-filter-group-to-create.util'; import { fromDeleteViewFilterGroupInputToFlatViewFilterGroupOrThrow } from 'src/engine/metadata-modules/flat-view-filter-group/utils/from-delete-view-filter-group-input-to-flat-view-filter-group-or-throw.util'; import { fromDestroyViewFilterGroupInputToFlatViewFilterGroupOrThrow } from 'src/engine/metadata-modules/flat-view-filter-group/utils/from-destroy-view-filter-group-input-to-flat-view-filter-group-or-throw.util'; @@ -59,7 +60,6 @@ export class ViewFilterGroupService { const flatViewFilterGroupToCreate = fromCreateViewFilterGroupInputToFlatViewFilterGroupToCreate({ createViewFilterGroupInput, - workspaceId, flatApplication: workspaceCustomFlatApplication, flatViewMaps: existingFlatViewMaps, flatViewFilterGroupMaps: existingFlatViewFilterGroupMaps, @@ -172,8 +172,9 @@ export class ViewFilterGroupService { ); return fromFlatViewFilterGroupToViewFilterGroupDto( - findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: optimisticallyUpdatedFlatViewFilterGroup.id, + findFlatEntityByUniversalIdentifierOrThrow({ + universalIdentifier: + optimisticallyUpdatedFlatViewFilterGroup.universalIdentifier, flatEntityMaps: recomputedExistingFlatViewFilterGroupMaps, }), ); @@ -244,8 +245,9 @@ export class ViewFilterGroupService { ); return fromFlatViewFilterGroupToViewFilterGroupDto( - findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: optimisticallyUpdatedFlatViewFilterGroupWithDeletedAt.id, + findFlatEntityByUniversalIdentifierOrThrow({ + universalIdentifier: + optimisticallyUpdatedFlatViewFilterGroupWithDeletedAt.universalIdentifier, flatEntityMaps: recomputedExistingFlatViewFilterGroupMaps, }), ); @@ -279,6 +281,13 @@ export class ViewFilterGroupService { flatViewFilterGroupMaps: existingFlatViewFilterGroupMaps, }); + const existingFlatViewFilterGroup = + findFlatEntityByUniversalIdentifierOrThrow({ + universalIdentifier: + existingViewFilterGroupToDelete.universalIdentifier, + flatEntityMaps: existingFlatViewFilterGroupMaps, + }); + const validateAndBuildResult = await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { @@ -303,9 +312,10 @@ export class ViewFilterGroupService { ); } - return fromFlatViewFilterGroupToViewFilterGroupDto( - existingViewFilterGroupToDelete, - ); + return fromFlatViewFilterGroupToViewFilterGroupDto({ + ...existingFlatViewFilterGroup, + deletedAt: new Date().toISOString(), + }); } async findByWorkspaceId( diff --git a/packages/twenty-server/src/engine/metadata-modules/view-filter/services/view-filter.service.ts b/packages/twenty-server/src/engine/metadata-modules/view-filter/services/view-filter.service.ts index cdf897fa9b..143183f0ec 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-filter/services/view-filter.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-filter/services/view-filter.service.ts @@ -7,6 +7,7 @@ import { IsNull, Repository } from 'typeorm'; import { ApplicationService } from 'src/engine/core-modules/application/services/application.service'; import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { fromCreateViewFilterInputToFlatViewFilterToCreate } from 'src/engine/metadata-modules/flat-view-filter/utils/from-create-view-filter-input-to-flat-view-filter-to-create.util'; import { fromDeleteViewFilterInputToFlatViewFilterOrThrow } from 'src/engine/metadata-modules/flat-view-filter/utils/from-delete-view-filter-input-to-flat-view-filter-or-throw.util'; import { fromDestroyViewFilterInputToFlatViewFilterOrThrow } from 'src/engine/metadata-modules/flat-view-filter/utils/from-destroy-view-filter-input-to-flat-view-filter-or-throw.util'; @@ -60,7 +61,6 @@ export class ViewFilterService { const flatViewFilterToCreate = fromCreateViewFilterInputToFlatViewFilterToCreate({ createViewFilterInput, - workspaceId, flatApplication: workspaceCustomFlatApplication, flatFieldMetadataMaps, flatViewMaps, @@ -177,8 +177,9 @@ export class ViewFilterService { ); return fromFlatViewFilterToViewFilterDto( - findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: optimisticallyUpdatedFlatViewFilter.id, + findFlatEntityByUniversalIdentifierOrThrow({ + universalIdentifier: + optimisticallyUpdatedFlatViewFilter.universalIdentifier, flatEntityMaps: recomputedExistingFlatViewFilterMaps, }), ); @@ -247,8 +248,9 @@ export class ViewFilterService { ); return fromFlatViewFilterToViewFilterDto( - findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: optimisticallyUpdatedFlatViewFilterWithDeletedAt.id, + findFlatEntityByUniversalIdentifierOrThrow({ + universalIdentifier: + optimisticallyUpdatedFlatViewFilterWithDeletedAt.universalIdentifier, flatEntityMaps: recomputedExistingFlatViewFilterMaps, }), ); @@ -282,6 +284,11 @@ export class ViewFilterService { flatViewFilterMaps: existingFlatViewFilterMaps, }); + const existingFlatViewFilter = findFlatEntityByUniversalIdentifierOrThrow({ + universalIdentifier: existingViewFilterToDelete.universalIdentifier, + flatEntityMaps: existingFlatViewFilterMaps, + }); + const validateAndBuildResult = await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { @@ -306,7 +313,10 @@ export class ViewFilterService { ); } - return fromFlatViewFilterToViewFilterDto(existingViewFilterToDelete); + return fromFlatViewFilterToViewFilterDto({ + ...existingFlatViewFilter, + deletedAt: new Date().toISOString(), + }); } async findByWorkspaceId(workspaceId: string): Promise { diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts index ab248dddb3..111580740a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts @@ -6,8 +6,8 @@ import { IsNull, Repository } from 'typeorm'; import { ApplicationService } from 'src/engine/core-modules/application/services/application.service'; import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; -import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { fromCreateViewGroupInputToFlatViewGroupToCreate } from 'src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util'; import { fromDeleteViewGroupInputToFlatViewGroupOrThrow } from 'src/engine/metadata-modules/flat-view-group/utils/from-delete-view-group-input-to-flat-view-group-or-throw.util'; @@ -101,7 +101,6 @@ export class ViewGroupService { return fromCreateViewGroupInputToFlatViewGroupToCreate({ createViewGroupInput, - workspaceId, flatApplication: workspaceCustomFlatApplication, flatViewMaps, }); @@ -207,8 +206,9 @@ export class ViewGroupService { ); return fromFlatViewGroupToViewGroupDto( - findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: optimisticallyUpdatedFlatViewGroup.id, + findFlatEntityByUniversalIdentifierOrThrow({ + universalIdentifier: + optimisticallyUpdatedFlatViewGroup.universalIdentifier, flatEntityMaps: recomputedExistingFlatViewGroupMaps, }), ); @@ -277,8 +277,9 @@ export class ViewGroupService { ); return fromFlatViewGroupToViewGroupDto( - findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: optimisticallyUpdatedFlatViewGroupWithDeletedAt.id, + findFlatEntityByUniversalIdentifierOrThrow({ + universalIdentifier: + optimisticallyUpdatedFlatViewGroupWithDeletedAt.universalIdentifier, flatEntityMaps: recomputedExistingFlatViewGroupMaps, }), ); @@ -312,6 +313,11 @@ export class ViewGroupService { flatViewGroupMaps: existingFlatViewGroupMaps, }); + const existingFlatViewGroup = findFlatEntityByUniversalIdentifierOrThrow({ + universalIdentifier: existingViewGroupToDelete.universalIdentifier, + flatEntityMaps: existingFlatViewGroupMaps, + }); + const validateAndBuildResult = await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { @@ -336,7 +342,10 @@ export class ViewGroupService { ); } - return fromFlatViewGroupToViewGroupDto(existingViewGroupToDelete); + return fromFlatViewGroupToViewGroupDto({ + ...existingFlatViewGroup, + deletedAt: new Date().toISOString(), + }); } async findByWorkspaceId(workspaceId: string): Promise { diff --git a/packages/twenty-server/src/engine/metadata-modules/view/services/view.service.ts b/packages/twenty-server/src/engine/metadata-modules/view/services/view.service.ts index 2d7446b392..a0b8852a2b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view/services/view.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view/services/view.service.ts @@ -10,6 +10,7 @@ import { I18nService } from 'src/engine/core-modules/i18n/i18n.service'; import { generateMessageId } from 'src/engine/core-modules/i18n/utils/generateMessageId'; import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { fromCreateViewInputToFlatViewToCreate } from 'src/engine/metadata-modules/flat-view/utils/from-create-view-input-to-flat-view-to-create.util'; import { fromDeleteViewInputToFlatViewOrThrow } from 'src/engine/metadata-modules/flat-view/utils/from-delete-view-input-to-flat-view-or-throw.util'; import { fromDestroyViewInputToFlatViewOrThrow } from 'src/engine/metadata-modules/flat-view/utils/from-destroy-view-input-to-flat-view-or-throw.util'; @@ -66,7 +67,6 @@ export class ViewService { const { flatViewToCreate, flatViewGroupsToCreate } = fromCreateViewInputToFlatViewToCreate({ createViewInput, - workspaceId, createdByUserWorkspaceId, flatApplication: workspaceCustomFlatApplication, flatFieldMetadataMaps: existingFlatFieldMetadataMaps, @@ -299,6 +299,11 @@ export class ViewService { flatViewMaps: existingFlatViewMaps, }); + const existingFlatView = findFlatEntityByUniversalIdentifierOrThrow({ + universalIdentifier: flatViewFromDestroyInput.universalIdentifier, + flatEntityMaps: existingFlatViewMaps, + }); + const validateAndBuildResult = await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { @@ -323,7 +328,10 @@ export class ViewService { ); } - return fromFlatViewToViewDto(flatViewFromDestroyInput); + return fromFlatViewToViewDto({ + ...existingFlatView, + deletedAt: new Date().toISOString(), + }); } processViewNameWithTemplate( diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/services/twenty-standard-application.service.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/services/twenty-standard-application.service.ts index 1c81d265fd..9ca3c8d616 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/services/twenty-standard-application.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/services/twenty-standard-application.service.ts @@ -77,13 +77,15 @@ export class TwentyStandardApplicationService { 'SHOULD_SEED_STANDARD_RECORD_PAGE_LAYOUTS', ); - const toTwentyStandardAllFlatEntityMaps = - computeTwentyStandardApplicationAllFlatEntityMaps({ - now: new Date().toISOString(), - workspaceId, - twentyStandardApplicationId: twentyStandardFlatApplication.id, - shouldIncludeRecordPageLayouts, - }); + const { + allFlatEntityMaps: toTwentyStandardAllFlatEntityMaps, + idByUniversalIdentifierByMetadataName, + } = computeTwentyStandardApplicationAllFlatEntityMaps({ + now: new Date().toISOString(), + workspaceId, + twentyStandardApplicationId: twentyStandardFlatApplication.id, + shouldIncludeRecordPageLayouts, + }); const fromToAllFlatEntityMaps: FromToAllFlatEntityMaps = {}; @@ -119,6 +121,7 @@ export class TwentyStandardApplicationService { }, applicationUniversalIdentifier: twentyStandardFlatApplication.universalIdentifier, + idByUniversalIdentifierByMetadataName, }, ); diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/types/metadata-standard-buillder-args.type.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/types/metadata-standard-buillder-args.type.ts index 51c4db557e..8ac3f1aca5 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/types/metadata-standard-buillder-args.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/types/metadata-standard-buillder-args.type.ts @@ -1,10 +1,10 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; -import { type MetadataValidationRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; +import { type MetadataValidationRelatedUniversalFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; import { type StandardObjectMetadataRelatedEntityIds } from 'src/engine/workspace-manager/twenty-standard-application/utils/get-standard-object-metadata-related-entity-ids.util'; import { type ComputeTwentyStandardApplicationAllFlatEntityMapsArgs } from 'src/engine/workspace-manager/twenty-standard-application/utils/twenty-standard-application-all-flat-entity-maps.constant'; export type StandardBuilderArgs = { standardObjectMetadataRelatedEntityIds: StandardObjectMetadataRelatedEntityIds; - dependencyFlatEntityMaps: MetadataValidationRelatedFlatEntityMaps; + dependencyFlatEntityMaps: MetadataValidationRelatedUniversalFlatEntityMaps; } & ComputeTwentyStandardApplicationAllFlatEntityMapsArgs; diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/index/create-standard-index-flat-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/index/create-standard-index-flat-metadata.util.ts index dd94535404..88400b3ed7 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/index/create-standard-index-flat-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/index/create-standard-index-flat-metadata.util.ts @@ -2,8 +2,8 @@ import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; import { v4 } from 'uuid'; -import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; +import { findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-universal-identifier-in-universal-flat-entity-maps-or-throw.util'; import { type FlatIndexFieldMetadata, type FlatIndexMetadata, @@ -15,6 +15,7 @@ import { type AllStandardObjectFieldName } from 'src/engine/workspace-manager/tw import { type AllStandardObjectIndexName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-index-name.type'; import { type AllStandardObjectName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-name.type'; import { type StandardBuilderArgs } from 'src/engine/workspace-manager/twenty-standard-application/types/metadata-standard-buillder-args.type'; +import { type UniversalFlatIndexFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; export type CreateStandardIndexOptions = { indexName: AllStandardObjectIndexName; @@ -59,52 +60,80 @@ export const createStandardIndexFlatMetadata = < universalIdentifier: string; }; + const objectFields = STANDARD_OBJECTS[objectName].fields; + const objectMetadataId = standardObjectMetadataRelatedEntityIds[objectName].id; - const flatObjectMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: objectMetadataId, - flatEntityMaps: flatObjectMetadataMaps, - }); - const relatedFieldIds = relatedFieldNames.map( (fieldName) => standardObjectMetadataRelatedEntityIds[objectName].fields[fieldName].id, ); - const flatFieldMetadatas = findManyFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityIds: relatedFieldIds, - flatEntityMaps: flatFieldMetadataMaps, + + const objectMetadataUniversalIdentifier = + STANDARD_OBJECTS[objectName].universalIdentifier; + const flatObjectMetadata = findFlatEntityByUniversalIdentifierOrThrow({ + universalIdentifier: objectMetadataUniversalIdentifier, + flatEntityMaps: flatObjectMetadataMaps, }); + const relatedFieldUniversalIdentifiers = relatedFieldNames.map( + (fieldName) => + objectFields[fieldName as keyof typeof objectFields].universalIdentifier, + ); + const flatFieldMetadatas = + findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow({ + universalIdentifiers: relatedFieldUniversalIdentifiers, + flatEntityMaps: flatFieldMetadataMaps, + }); + const indexId = v4(); - return generateFlatIndexMetadataWithNameOrThrow({ + const unviersalFlatIndex = generateFlatIndexMetadataWithNameOrThrow({ flatIndex: { createdAt: now, - applicationId: twentyStandardApplicationId, applicationUniversalIdentifier: TWENTY_STANDARD_APPLICATION.universalIdentifier, indexType, indexWhereClause, isCustom: false, isUnique, - objectMetadataId, objectMetadataUniversalIdentifier: flatObjectMetadata.universalIdentifier, universalIdentifier: indexDefinition.universalIdentifier, updatedAt: now, - workspaceId, - id: indexId, - flatIndexFieldMetadatas: flatFieldMetadatas.map( - ({ id: fieldMetadataId }, index) => ({ - createdAt: now, - fieldMetadataId, - id: v4(), - indexMetadataId: indexId, - order: index, - updatedAt: now, - }), - ), + universalFlatIndexFieldMetadatas: + flatFieldMetadatas.map( + ( + { universalIdentifier: fieldMetadataUniversalIdentifier }, + index, + ) => ({ + createdAt: now, + order: index, + updatedAt: now, + fieldMetadataUniversalIdentifier, + indexMetadataUniversalIdentifier: + indexDefinition.universalIdentifier, + }), + ), }, flatObjectMetadata, objectFlatFieldMetadatas: flatFieldMetadatas, }); + + return { + ...unviersalFlatIndex, + applicationId: twentyStandardApplicationId, + id: v4(), + flatIndexFieldMetadatas: relatedFieldIds.map( + (fieldMetadataId, index) => ({ + createdAt: now, + fieldMetadataId, + id: v4(), + indexMetadataId: indexId, + order: index, + updatedAt: now, + }), + ), + workspaceId, + objectMetadataId, + }; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/page-layout-widget/build-standard-flat-page-layout-widget-metadata-maps.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/page-layout-widget/build-standard-flat-page-layout-widget-metadata-maps.util.ts index 5dc42ff715..a03a611693 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/page-layout-widget/build-standard-flat-page-layout-widget-metadata-maps.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/page-layout-widget/build-standard-flat-page-layout-widget-metadata-maps.util.ts @@ -101,6 +101,9 @@ const computeRecordPageWidgets = ({ configuration: { configurationType: WidgetConfigurationType.FIELDS, }, + universalConfiguration: { + configurationType: WidgetConfigurationType.FIELDS, + }, objectMetadataId, conditionalDisplay: widget.conditionalDisplay ?? null, }, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/page-layout-widget/compute-my-first-dashboard-widgets.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/page-layout-widget/compute-my-first-dashboard-widgets.util.ts index 9f574306b1..a73e7a12b2 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/page-layout-widget/compute-my-first-dashboard-widgets.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/page-layout-widget/compute-my-first-dashboard-widgets.util.ts @@ -1,7 +1,7 @@ import { CalendarStartDay } from 'twenty-shared/constants'; +import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { PageLayoutTabLayoutMode } from 'twenty-shared/types'; import { v4 } from 'uuid'; -import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { AggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/aggregate-operations.constant'; import { type FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type'; @@ -57,8 +57,152 @@ const createWelcomeRichText = ({ args, }: { args: DashboardWidgetBuilderArgs; -}): FlatPageLayoutWidget => - createStandardPageLayoutWidgetFlatMetadata({ +}): FlatPageLayoutWidget => { + const configuration = { + configurationType: WidgetConfigurationType.STANDALONE_RICH_TEXT as const, + body: { + blocknote: JSON.stringify([ + { + id: v4(), + type: 'heading', + props: { + textColor: 'default', + backgroundColor: 'default', + textAlignment: 'left', + level: 3, + }, + content: [ + { + type: 'text', + text: 'Welcome to your workspace', + styles: {}, + }, + ], + children: [], + }, + { + id: v4(), + type: 'paragraph', + props: { + textColor: 'default', + backgroundColor: 'default', + textAlignment: 'left', + }, + content: [], + children: [], + }, + { + id: v4(), + type: 'paragraph', + props: { + textColor: 'default', + backgroundColor: 'default', + textAlignment: 'left', + }, + content: [ + { + type: 'text', + text: 'You can edit this dashboard by clicking the ', + styles: {}, + }, + { type: 'text', text: 'Edit', styles: { code: true } }, + { + type: 'text', + text: ' button in the top-right corner to add your own charts or customize this one.', + styles: {}, + }, + ], + children: [], + }, + { + id: v4(), + type: 'paragraph', + props: { + textColor: 'default', + backgroundColor: 'default', + textAlignment: 'left', + }, + content: [], + children: [], + }, + { + id: v4(), + type: 'paragraph', + props: { + textColor: 'default', + backgroundColor: 'default', + textAlignment: 'left', + }, + content: [ + { + type: 'text', + text: "Don't forget to replace the sample data with your own.", + styles: {}, + }, + ], + children: [], + }, + { + id: v4(), + type: 'paragraph', + props: { + textColor: 'default', + backgroundColor: 'default', + textAlignment: 'left', + }, + content: [], + children: [], + }, + { + id: v4(), + type: 'paragraph', + props: { + textColor: 'default', + backgroundColor: 'default', + textAlignment: 'left', + }, + content: [ + { + type: 'text', + text: 'If you have any issues, you can check ', + styles: {}, + }, + { + type: 'link', + href: 'https://docs.twenty.com/user-guide/introduction', + content: [ + { + type: 'text', + text: 'our documentation', + styles: {}, + }, + ], + }, + { + type: 'text', + text: ' or contact us through the Support section in Settings.', + styles: {}, + }, + ], + children: [], + }, + { + id: v4(), + type: 'paragraph', + props: { + textColor: 'default', + backgroundColor: 'default', + textAlignment: 'left', + }, + content: [], + children: [], + }, + ]), + markdown: null, + }, + }; + + return createStandardPageLayoutWidgetFlatMetadata({ ...args, objectMetadataUniversalIdentifier: null, context: { @@ -75,154 +219,13 @@ const createWelcomeRichText = ({ rowSpan: 6, columnSpan: 6, }, - configuration: { - configurationType: - WidgetConfigurationType.STANDALONE_RICH_TEXT as const, - body: { - blocknote: JSON.stringify([ - { - id: v4(), - type: 'heading', - props: { - textColor: 'default', - backgroundColor: 'default', - textAlignment: 'left', - level: 3, - }, - content: [ - { - type: 'text', - text: 'Welcome to your workspace', - styles: {}, - }, - ], - children: [], - }, - { - id: v4(), - type: 'paragraph', - props: { - textColor: 'default', - backgroundColor: 'default', - textAlignment: 'left', - }, - content: [], - children: [], - }, - { - id: v4(), - type: 'paragraph', - props: { - textColor: 'default', - backgroundColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'You can edit this dashboard by clicking the ', - styles: {}, - }, - { type: 'text', text: 'Edit', styles: { code: true } }, - { - type: 'text', - text: ' button in the top-right corner to add your own charts or customize this one.', - styles: {}, - }, - ], - children: [], - }, - { - id: v4(), - type: 'paragraph', - props: { - textColor: 'default', - backgroundColor: 'default', - textAlignment: 'left', - }, - content: [], - children: [], - }, - { - id: v4(), - type: 'paragraph', - props: { - textColor: 'default', - backgroundColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: "Don't forget to replace the sample data with your own.", - styles: {}, - }, - ], - children: [], - }, - { - id: v4(), - type: 'paragraph', - props: { - textColor: 'default', - backgroundColor: 'default', - textAlignment: 'left', - }, - content: [], - children: [], - }, - { - id: v4(), - type: 'paragraph', - props: { - textColor: 'default', - backgroundColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'If you have any issues, you can check ', - styles: {}, - }, - { - type: 'link', - href: 'https://docs.twenty.com/user-guide/introduction', - content: [ - { - type: 'text', - text: 'our documentation', - styles: {}, - }, - ], - }, - { - type: 'text', - text: ' or contact us through the Support section in Settings.', - styles: {}, - }, - ], - children: [], - }, - { - id: v4(), - type: 'paragraph', - props: { - textColor: 'default', - backgroundColor: 'default', - textAlignment: 'left', - }, - content: [], - children: [], - }, - ]), - markdown: null, - }, - }, + configuration, + universalConfiguration: configuration, objectMetadataId: null, conditionalDisplay: null, }, }); +}; const createDealsByCompany = ({ args, @@ -266,6 +269,22 @@ const createDealsByCompany = ({ timezone: 'UTC', firstDayOfTheWeek: CalendarStartDay.SUNDAY, }, + universalConfiguration: { + configurationType: WidgetConfigurationType.PIE_CHART, + groupByFieldMetadataUniversalIdentifier: + STANDARD_OBJECTS.opportunity.fields.company.universalIdentifier, + groupBySubFieldName: 'name', + aggregateFieldMetadataUniversalIdentifier: + STANDARD_OBJECTS.opportunity.fields.id.universalIdentifier, + aggregateOperation: AggregateOperations.COUNT, + orderBy: GraphOrderBy.FIELD_ASC, + displayDataLabel: false, + showCenterMetric: true, + displayLegend: true, + color: 'orange', + timezone: 'UTC', + firstDayOfTheWeek: CalendarStartDay.SUNDAY, + }, objectMetadataId: opportunityObjectId, conditionalDisplay: null, }, @@ -320,6 +339,29 @@ const createPipelineValueByStage = ({ timezone: 'UTC', firstDayOfTheWeek: CalendarStartDay.SUNDAY, }, + universalConfiguration: { + configurationType: WidgetConfigurationType.BAR_CHART, + aggregateFieldMetadataUniversalIdentifier: + STANDARD_OBJECTS.opportunity.fields.amount.universalIdentifier, + aggregateOperation: AggregateOperations.SUM, + primaryAxisGroupByFieldMetadataUniversalIdentifier: + STANDARD_OBJECTS.opportunity.fields.stage.universalIdentifier, + primaryAxisDateGranularity: ObjectRecordGroupByDateGranularity.DAY, + primaryAxisOrderBy: GraphOrderBy.FIELD_POSITION_ASC, + secondaryAxisGroupByFieldMetadataUniversalIdentifier: + STANDARD_OBJECTS.opportunity.fields.company.universalIdentifier, + secondaryAxisGroupBySubFieldName: 'name', + secondaryAxisGroupByDateGranularity: + ObjectRecordGroupByDateGranularity.DAY, + secondaryAxisOrderBy: GraphOrderBy.FIELD_ASC, + axisNameDisplay: AxisNameDisplay.NONE, + displayDataLabel: true, + displayLegend: true, + color: 'green', + layout: BarChartLayout.VERTICAL, + timezone: 'UTC', + firstDayOfTheWeek: CalendarStartDay.SUNDAY, + }, objectMetadataId: opportunityObjectId, conditionalDisplay: null, }, @@ -369,6 +411,23 @@ const createRevenueTimeline = ({ timezone: 'UTC', firstDayOfTheWeek: CalendarStartDay.SUNDAY, }, + universalConfiguration: { + configurationType: WidgetConfigurationType.LINE_CHART, + aggregateFieldMetadataUniversalIdentifier: + STANDARD_OBJECTS.opportunity.fields.amount.universalIdentifier, + aggregateOperation: AggregateOperations.SUM, + primaryAxisGroupByFieldMetadataUniversalIdentifier: + STANDARD_OBJECTS.opportunity.fields.closeDate.universalIdentifier, + primaryAxisDateGranularity: ObjectRecordGroupByDateGranularity.DAY, + primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, + axisNameDisplay: AxisNameDisplay.NONE, + displayDataLabel: false, + displayLegend: true, + color: 'crimson', + isCumulative: false, + timezone: 'UTC', + firstDayOfTheWeek: CalendarStartDay.SUNDAY, + }, objectMetadataId: opportunityObjectId, conditionalDisplay: null, }, @@ -425,6 +484,31 @@ const createOpportunitiesByOwner = ({ timezone: 'UTC', firstDayOfTheWeek: CalendarStartDay.SUNDAY, }, + universalConfiguration: { + configurationType: WidgetConfigurationType.BAR_CHART, + aggregateFieldMetadataUniversalIdentifier: + STANDARD_OBJECTS.opportunity.fields.id.universalIdentifier, + aggregateOperation: AggregateOperations.COUNT, + primaryAxisGroupByFieldMetadataUniversalIdentifier: + STANDARD_OBJECTS.opportunity.fields.owner.universalIdentifier, + primaryAxisGroupBySubFieldName: 'name.firstName', + primaryAxisDateGranularity: ObjectRecordGroupByDateGranularity.DAY, + primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, + secondaryAxisGroupByFieldMetadataUniversalIdentifier: + STANDARD_OBJECTS.opportunity.fields.owner.universalIdentifier, + secondaryAxisGroupBySubFieldName: 'name.firstName', + secondaryAxisGroupByDateGranularity: + ObjectRecordGroupByDateGranularity.DAY, + secondaryAxisOrderBy: GraphOrderBy.FIELD_ASC, + axisNameDisplay: AxisNameDisplay.NONE, + displayDataLabel: false, + displayLegend: true, + color: 'blue', + layout: BarChartLayout.HORIZONTAL, + isCumulative: false, + timezone: 'UTC', + firstDayOfTheWeek: CalendarStartDay.SUNDAY, + }, objectMetadataId: opportunityObjectId, conditionalDisplay: null, }, @@ -435,8 +519,13 @@ const createStockMarketIframe = ({ args, }: { args: DashboardWidgetBuilderArgs; -}): FlatPageLayoutWidget => - createStandardPageLayoutWidgetFlatMetadata({ +}): FlatPageLayoutWidget => { + const configuration = { + configurationType: WidgetConfigurationType.IFRAME as const, + url: 'https://www.tradingview.com/embed-widget/hotlists/?locale=en', + }; + + return createStandardPageLayoutWidgetFlatMetadata({ ...args, objectMetadataUniversalIdentifier: null, context: { @@ -453,14 +542,13 @@ const createStockMarketIframe = ({ rowSpan: 8, columnSpan: 6, }, - configuration: { - configurationType: WidgetConfigurationType.IFRAME as const, - url: 'https://www.tradingview.com/embed-widget/hotlists/?locale=en', - }, + configuration, + universalConfiguration: configuration, objectMetadataId: null, conditionalDisplay: null, }, }); +}; const createDealsCreatedThisMonth = ({ args, @@ -472,6 +560,17 @@ const createDealsCreatedThisMonth = ({ const opportunityObjectId = args.standardObjectMetadataRelatedEntityIds.opportunity.id; + const filterConfig = createFilterConfig([ + { + type: 'DATE_TIME', + label: 'Creation date', + value: 'THIS_1_MONTH;;UTC;;SUNDAY;;', + displayValue: 'THIS_1_MONTH;;UTC;;SUNDAY;;', + operand: 'IS_RELATIVE', + fieldMetadataId: opportunityFields.createdAt.id, + }, + ]); + return createStandardPageLayoutWidgetFlatMetadata({ ...args, objectMetadataUniversalIdentifier: @@ -495,16 +594,18 @@ const createDealsCreatedThisMonth = ({ aggregateFieldMetadataId: opportunityFields.id.id, aggregateOperation: AggregateOperations.COUNT, displayDataLabel: false, - filter: createFilterConfig([ - { - type: 'DATE_TIME', - label: 'Creation date', - value: 'THIS_1_MONTH;;UTC;;SUNDAY;;', - displayValue: 'THIS_1_MONTH;;UTC;;SUNDAY;;', - operand: 'IS_RELATIVE', - fieldMetadataId: opportunityFields.createdAt.id, - }, - ]), + filter: filterConfig, + prefix: '', + timezone: 'UTC', + firstDayOfTheWeek: CalendarStartDay.SUNDAY, + }, + universalConfiguration: { + configurationType: WidgetConfigurationType.AGGREGATE_CHART, + aggregateFieldMetadataUniversalIdentifier: + STANDARD_OBJECTS.opportunity.fields.id.universalIdentifier, + aggregateOperation: AggregateOperations.COUNT, + displayDataLabel: false, + filter: filterConfig, prefix: '', timezone: 'UTC', firstDayOfTheWeek: CalendarStartDay.SUNDAY, @@ -525,6 +626,17 @@ const createDealValueCreatedThisMonth = ({ const opportunityObjectId = args.standardObjectMetadataRelatedEntityIds.opportunity.id; + const filterConfig = createFilterConfig([ + { + type: 'DATE_TIME', + label: 'Creation date', + value: 'THIS_1_MONTH;;UTC;;SUNDAY;;', + displayValue: 'THIS_1_MONTH;;UTC;;SUNDAY;;', + operand: 'IS_RELATIVE', + fieldMetadataId: opportunityFields.createdAt.id, + }, + ]); + return createStandardPageLayoutWidgetFlatMetadata({ ...args, objectMetadataUniversalIdentifier: @@ -548,16 +660,18 @@ const createDealValueCreatedThisMonth = ({ aggregateFieldMetadataId: opportunityFields.amount.id, aggregateOperation: AggregateOperations.SUM, displayDataLabel: false, - filter: createFilterConfig([ - { - type: 'DATE_TIME', - label: 'Creation date', - value: 'THIS_1_MONTH;;UTC;;SUNDAY;;', - displayValue: 'THIS_1_MONTH;;UTC;;SUNDAY;;', - operand: 'IS_RELATIVE', - fieldMetadataId: opportunityFields.createdAt.id, - }, - ]), + filter: filterConfig, + prefix: '$', + timezone: 'UTC', + firstDayOfTheWeek: CalendarStartDay.SUNDAY, + }, + universalConfiguration: { + configurationType: WidgetConfigurationType.AGGREGATE_CHART, + aggregateFieldMetadataUniversalIdentifier: + STANDARD_OBJECTS.opportunity.fields.amount.universalIdentifier, + aggregateOperation: AggregateOperations.SUM, + displayDataLabel: false, + filter: filterConfig, prefix: '$', timezone: 'UTC', firstDayOfTheWeek: CalendarStartDay.SUNDAY, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/page-layout-widget/create-standard-page-layout-widget-flat-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/page-layout-widget/create-standard-page-layout-widget-flat-metadata.util.ts index 0103f825d8..6159bb0e7b 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/page-layout-widget/create-standard-page-layout-widget-flat-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/page-layout-widget/create-standard-page-layout-widget-flat-metadata.util.ts @@ -4,6 +4,7 @@ import { } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; +import { type MetadataUniversalFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-universal-flat-entity.type'; import { type FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type'; import { type WidgetType } from 'src/engine/metadata-modules/page-layout-widget/enums/widget-type.enum'; import { type AllPageLayoutWidgetConfiguration } from 'src/engine/metadata-modules/page-layout-widget/types/all-page-layout-widget-configuration.type'; @@ -26,6 +27,7 @@ export type CreateStandardPageLayoutWidgetContext = { gridPosition: GridPosition; position: PageLayoutWidgetPosition | null; configuration: AllPageLayoutWidgetConfiguration; + universalConfiguration: MetadataUniversalFlatEntity<'pageLayoutWidget'>['universalConfiguration']; objectMetadataId: string | null; conditionalDisplay: PageLayoutWidgetConditionalDisplay | null; }; @@ -49,6 +51,7 @@ export const createStandardPageLayoutWidgetFlatMetadata = ({ gridPosition, position, configuration, + universalConfiguration, objectMetadataId, conditionalDisplay, }, @@ -98,6 +101,7 @@ export const createStandardPageLayoutWidgetFlatMetadata = ({ gridPosition, position, configuration, + universalConfiguration, objectMetadataId, objectMetadataUniversalIdentifier, createdAt: now, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/twenty-standard-application-all-flat-entity-maps.constant.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/twenty-standard-application-all-flat-entity-maps.constant.ts index 738711e118..29fef22e71 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/twenty-standard-application-all-flat-entity-maps.constant.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/twenty-standard-application-all-flat-entity-maps.constant.ts @@ -1,4 +1,8 @@ +import { isDefined } from 'twenty-shared/utils'; + import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant'; +import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; +import { TWENTY_STANDARD_ALL_METADATA_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-all-metadata-name.constant'; import { type TwentyStandardAllFlatEntityMaps } from 'src/engine/workspace-manager/twenty-standard-application/types/twenty-standard-all-flat-entity-maps.type'; import { buildStandardFlatAgentMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/agent-metadata/build-standard-flat-agent-metadata-maps.util'; import { buildStandardFlatFieldMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/build-standard-flat-field-metadata-maps.util'; @@ -16,6 +20,7 @@ import { buildStandardFlatViewFieldMetadataMaps } from 'src/engine/workspace-man import { buildStandardFlatViewFilterMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-filter/build-standard-flat-view-filter-metadata-maps.util'; import { buildStandardFlatViewGroupMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-group/build-standard-flat-view-group-metadata-maps.util'; import { buildStandardFlatViewMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/view/build-standard-flat-view-metadata-maps.util'; +import { type IdByUniversalIdentifierByMetadataName } from 'src/engine/workspace-manager/workspace-migration/services/utils/enrich-create-workspace-migration-action-with-ids.util'; export type ComputeTwentyStandardApplicationAllFlatEntityMapsArgs = { now: string; @@ -29,7 +34,11 @@ export const computeTwentyStandardApplicationAllFlatEntityMaps = ({ workspaceId, twentyStandardApplicationId, shouldIncludeRecordPageLayouts, -}: ComputeTwentyStandardApplicationAllFlatEntityMapsArgs): TwentyStandardAllFlatEntityMaps => { +}: ComputeTwentyStandardApplicationAllFlatEntityMapsArgs): { + allFlatEntityMaps: TwentyStandardAllFlatEntityMaps; + // TODO remove once all metadatas has fully been universal migrated + idByUniversalIdentifierByMetadataName: IdByUniversalIdentifierByMetadataName; +} => { const standardObjectMetadataRelatedEntityIds = getStandardObjectMetadataRelatedEntityIds(); @@ -177,7 +186,7 @@ export const computeTwentyStandardApplicationAllFlatEntityMaps = ({ }, }); - return { + const allFlatEntityMaps: TwentyStandardAllFlatEntityMaps = { flatViewFieldMaps, flatViewFilterMaps, flatViewGroupMaps, @@ -193,4 +202,28 @@ export const computeTwentyStandardApplicationAllFlatEntityMaps = ({ flatPageLayoutTabMaps, flatPageLayoutWidgetMaps, }; + + const idByUniversalIdentifierByMetadataName: IdByUniversalIdentifierByMetadataName = + {}; + + for (const metadataName of TWENTY_STANDARD_ALL_METADATA_NAME) { + const flatEntityMapsKey = getMetadataFlatEntityMapsKey(metadataName); + const flatEntityMaps = allFlatEntityMaps[flatEntityMapsKey]; + + const idByUniversalIdentifier = Object.fromEntries( + Object.entries(flatEntityMaps.universalIdentifierById) + .filter((entry): entry is [string, string] => isDefined(entry[1])) + .map(([id, universalIdentifier]) => [universalIdentifier, id]), + ); + + if (Object.keys(idByUniversalIdentifier).length > 0) { + idByUniversalIdentifierByMetadataName[metadataName] = + idByUniversalIdentifier; + } + } + + return { + allFlatEntityMaps, + idByUniversalIdentifierByMetadataName, + }; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view/create-standard-view-flat-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view/create-standard-view-flat-metadata.util.ts index f33161eda0..ffbfbd600d 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view/create-standard-view-flat-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view/create-standard-view-flat-metadata.util.ts @@ -93,10 +93,28 @@ export const createStandardViewFlatMetadata = < ].id : null; + const kanbanAggregateOperationFieldMetadataUniversalIdentifier = + kanbanAggregateOperationFieldName + ? // @ts-expect-error ignore + STANDARD_OBJECTS[objectName].fields[kanbanAggregateOperationFieldName] + .universalIdentifier + : null; + + const mainGroupByFieldMetadataUniversalIdentifier = mainGroupByFieldName + ? // @ts-expect-error ignore + STANDARD_OBJECTS[objectName].fields[mainGroupByFieldName] + .universalIdentifier + : null; + + const calendarFieldMetadataUniversalIdentifier = calendarFieldName + ? // @ts-expect-error ignore + STANDARD_OBJECTS[objectName].fields[calendarFieldName].universalIdentifier + : null; + return { - calendarFieldMetadataUniversalIdentifier: null, - kanbanAggregateOperationFieldMetadataUniversalIdentifier: null, - mainGroupByFieldMetadataUniversalIdentifier: null, + calendarFieldMetadataUniversalIdentifier, + kanbanAggregateOperationFieldMetadataUniversalIdentifier, + mainGroupByFieldMetadataUniversalIdentifier, objectMetadataUniversalIdentifier, id: standardObjectMetadataRelatedEntityIds[objectName].views[viewName].id, universalIdentifier: viewDefinition.universalIdentifier, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/utils/enrich-create-workspace-migration-action-with-ids.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/utils/enrich-create-workspace-migration-action-with-ids.util.ts new file mode 100644 index 0000000000..a5384d8e52 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/utils/enrich-create-workspace-migration-action-with-ids.util.ts @@ -0,0 +1,140 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; +import { assertUnreachable, isDefined } from 'twenty-shared/utils'; + +import { type UniversalCreateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; +import { type UniversalCreateObjectAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action'; +import { type WorkspaceMigration } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration'; + +export type IdByUniversalIdentifierByMetadataName = { + [P in AllMetadataName]?: Record; +}; + +const buildFieldIdByUniversalIdentifier = ({ + action, + fieldMetadataIdByUniversalIdentifier, +}: { + action: UniversalCreateObjectAction | UniversalCreateFieldAction; + fieldMetadataIdByUniversalIdentifier: Record; +}): Record | undefined => { + const fieldIdByUniversalIdentifier = { + ...action.fieldIdByUniversalIdentifier, + }; + + for (const universalFlatFieldMetadata of action.universalFlatFieldMetadatas) { + const providedFieldId = + fieldMetadataIdByUniversalIdentifier[ + universalFlatFieldMetadata.universalIdentifier + ]; + + if (isDefined(providedFieldId)) { + fieldIdByUniversalIdentifier[ + universalFlatFieldMetadata.universalIdentifier + ] = providedFieldId; + } + } + + if (Object.keys(fieldIdByUniversalIdentifier).length === 0) { + return undefined; + } + + return fieldIdByUniversalIdentifier; +}; + +export const enrichCreateWorkspaceMigrationActionsWithIds = ({ + workspaceMigration, + idByUniversalIdentifierByMetadataName, +}: { + workspaceMigration: WorkspaceMigration; + idByUniversalIdentifierByMetadataName: IdByUniversalIdentifierByMetadataName; +}): WorkspaceMigration => { + const fieldMetadataIdByUniversalIdentifier = + idByUniversalIdentifierByMetadataName.fieldMetadata; + + const enrichedActions = workspaceMigration.actions.map((action) => { + if (action.type !== 'create') { + return action; + } + + const idByUniversalIdentifier = + idByUniversalIdentifierByMetadataName[action.metadataName]; + + if ( + !isDefined(idByUniversalIdentifier) && + !isDefined(fieldMetadataIdByUniversalIdentifier) + ) { + return action; + } + + switch (action.metadataName) { + case 'objectMetadata': { + const id = isDefined(idByUniversalIdentifier) + ? idByUniversalIdentifier[action.flatEntity.universalIdentifier] + : undefined; + const fieldIdByUniversalIdentifier = isDefined( + fieldMetadataIdByUniversalIdentifier, + ) + ? buildFieldIdByUniversalIdentifier({ + action, + fieldMetadataIdByUniversalIdentifier, + }) + : undefined; + + return { + ...action, + id, + fieldIdByUniversalIdentifier, + }; + } + case 'fieldMetadata': { + if (!isDefined(fieldMetadataIdByUniversalIdentifier)) { + return action; + } + + return { + ...action, + fieldIdByUniversalIdentifier: buildFieldIdByUniversalIdentifier({ + action, + fieldMetadataIdByUniversalIdentifier, + }), + }; + } + case 'view': + case 'viewField': + case 'viewGroup': + case 'rowLevelPermissionPredicate': + case 'rowLevelPermissionPredicateGroup': + case 'viewFilterGroup': + case 'index': + case 'logicFunction': + case 'viewFilter': + case 'role': + case 'roleTarget': + case 'agent': + case 'skill': + case 'pageLayout': + case 'pageLayoutWidget': + case 'pageLayoutTab': + case 'commandMenuItem': + case 'navigationMenuItem': + case 'frontComponent': + case 'webhook': { + if (!isDefined(idByUniversalIdentifier)) { + return action; + } + + return { + ...action, + id: idByUniversalIdentifier[action.flatEntity.universalIdentifier], + }; + } + default: { + assertUnreachable(action); + } + } + }); + + return { + ...workspaceMigration, + actions: enrichedActions, + }; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-build-orchestrator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-build-orchestrator.service.ts index b17deb2ed9..eca8f05505 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-build-orchestrator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-build-orchestrator.service.ts @@ -4,8 +4,7 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; import { createEmptyAllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-all-flat-entity-maps.constant'; -import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; -import { type MetadataFlatEntityAndRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; +import { type MetadataUniversalFlatEntityAndRelatedUniversalFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; import { createEmptyOrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/constant/empty-orchestrator-actions-report.constant'; import { EMPTY_ORCHESTRATOR_FAILURE_REPORT } from 'src/engine/workspace-manager/workspace-migration/constant/empty-orchestrator-failure-report.constant'; import { @@ -13,6 +12,7 @@ import { type WorkspaceMigrationOrchestratorFailedResult, type WorkspaceMigrationOrchestratorSuccessfulResult, } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type'; +import { AllUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/all-universal-flat-entity-maps.type'; import { aggregateOrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report.util'; import { WorkspaceMigrationAgentActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/workspace-migration-agent-actions-builder.service'; import { WorkspaceMigrationCommandMenuItemActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/workspace-migration-command-menu-item-actions-builder.service'; @@ -70,12 +70,12 @@ export class WorkspaceMigrationBuildOrchestratorService { }: Pick< WorkspaceMigrationOrchestratorBuildArgs, 'fromToAllFlatEntityMaps' | 'dependencyAllFlatEntityMaps' - >): AllFlatEntityMaps { + >): AllUniversalFlatEntityMaps { const allFromToFlatEntityMapsKeys = Object.keys( fromToAllFlatEntityMaps, - ) as (keyof AllFlatEntityMaps)[]; + ) as (keyof AllUniversalFlatEntityMaps)[]; - return allFromToFlatEntityMapsKeys.reduce( + return allFromToFlatEntityMapsKeys.reduce( (allFlatEntityMaps, currFlatMaps) => { const fromToOccurence = fromToAllFlatEntityMaps[currFlatMaps]; @@ -104,12 +104,12 @@ export class WorkspaceMigrationBuildOrchestratorService { allFlatEntityMaps, flatEntityMapsAndRelatedFlatEntityMaps, }: { - flatEntityMapsAndRelatedFlatEntityMaps: MetadataFlatEntityAndRelatedFlatEntityMaps; - allFlatEntityMaps: AllFlatEntityMaps; + flatEntityMapsAndRelatedFlatEntityMaps: MetadataUniversalFlatEntityAndRelatedUniversalFlatEntityMaps; + allFlatEntityMaps: AllUniversalFlatEntityMaps; }) { const flatEntityMapsKeys = Object.keys( flatEntityMapsAndRelatedFlatEntityMaps, - ) as (keyof MetadataFlatEntityAndRelatedFlatEntityMaps)[]; + ) as (keyof MetadataUniversalFlatEntityAndRelatedUniversalFlatEntityMaps)[]; for (const flatEntityMapsKey of flatEntityMapsKeys) { // @ts-expect-error TODO improve @@ -183,20 +183,6 @@ export class WorkspaceMigrationBuildOrchestratorService { ...flatFieldMetadataMaps?.from.byUniversalIdentifier, ...flatFieldMetadataMaps?.to.byUniversalIdentifier, }, - universalIdentifierById: { - ...dependencyAllFlatEntityMaps?.flatFieldMetadataMaps - ?.universalIdentifierById, - ...flatFieldMetadataMaps?.from.universalIdentifierById, - ...flatFieldMetadataMaps?.to.universalIdentifierById, - }, - universalIdentifiersByApplicationId: { - ...dependencyAllFlatEntityMaps?.flatFieldMetadataMaps - ?.universalIdentifiersByApplicationId, - ...flatFieldMetadataMaps?.from - .universalIdentifiersByApplicationId, - ...flatFieldMetadataMaps?.to - .universalIdentifiersByApplicationId, - }, }, }, /// diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-validate-build-and-run-service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-validate-build-and-run-service.ts index ecb5189c66..f115b1cf49 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-validate-build-and-run-service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-validate-build-and-run-service.ts @@ -11,11 +11,15 @@ import { ALL_METADATA_REQUIRED_METADATA_FOR_VALIDATION } from 'src/engine/metada import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant'; import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { FlatEntityToCreateDeleteUpdate } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-to-create-delete-update.type'; -import { computeFlatEntityMapsFromTo } from 'src/engine/metadata-modules/flat-entity/utils/compute-flat-entity-maps-from-to.util'; +import { MetadataUniversalFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-universal-flat-entity.type'; import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service'; import { WorkspaceMigrationV2Exception } from 'src/engine/workspace-manager/workspace-migration.exception'; import { WORKSPACE_MIGRATION_ADDITIONAL_CACHE_DATA_MAPS_KEY } from 'src/engine/workspace-manager/workspace-migration/constant/workspace-migration-additional-cache-data-maps-key.constant'; +import { + enrichCreateWorkspaceMigrationActionsWithIds, + IdByUniversalIdentifierByMetadataName, +} from 'src/engine/workspace-manager/workspace-migration/services/utils/enrich-create-workspace-migration-action-with-ids.util'; import { WorkspaceMigrationBuildOrchestratorService } from 'src/engine/workspace-manager/workspace-migration/services/workspace-migration-build-orchestrator.service'; import { WorkspaceMigrationBuilderAdditionalCacheDataMaps } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-builder-additional-cache-data-maps.type'; import { @@ -23,6 +27,7 @@ import { WorkspaceMigrationOrchestratorBuildArgs, WorkspaceMigrationOrchestratorFailedResult, } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type'; +import { computeUniversalFlatEntityMapsFromTo } from 'src/engine/workspace-manager/workspace-migration/utils/compute-universal-flat-entity-maps-from-to.util'; import { InferDeletionFromMissingEntities } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/infer-deletion-from-missing-entities.type'; import { WorkspaceMigrationRunnerService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/services/workspace-migration-runner.service'; @@ -132,6 +137,7 @@ export class WorkspaceMigrationValidateBuildAndRunService { inferDeletionFromMissingEntities: InferDeletionFromMissingEntities; dependencyAllFlatEntityMaps: Partial; additionalCacheDataMaps: WorkspaceMigrationBuilderAdditionalCacheDataMaps; + idByUniversalIdentifierByMetadataName: IdByUniversalIdentifierByMetadataName; }> { const { allRelatedFlatEntityMaps, @@ -146,6 +152,8 @@ export class WorkspaceMigrationValidateBuildAndRunService { const fromToAllFlatEntityMaps: FromToAllFlatEntityMaps = {}; const inferDeletionFromMissingEntities: InferDeletionFromMissingEntities = {}; + const idByUniversalIdentifierByMetadataName: IdByUniversalIdentifierByMetadataName = + {}; const allMetadataNameToCompare = Object.keys( allFlatEntityOperationByMetadataName, ) as AllMetadataName[]; @@ -159,16 +167,35 @@ export class WorkspaceMigrationValidateBuildAndRunService { } const { flatEntityToCreate, flatEntityToDelete, flatEntityToUpdate } = flatEntityOperations; + + const idByUniversalIdentifier = Object.fromEntries( + flatEntityToCreate + .filter( + ( + flatEntity, + ): flatEntity is MetadataUniversalFlatEntity< + typeof metadataName + > & { id: string } => isDefined(flatEntity.id), + ) + .map((flatEntity) => [flatEntity.universalIdentifier, flatEntity.id]), + ); + + if (Object.keys(idByUniversalIdentifier).length > 0) { + idByUniversalIdentifierByMetadataName[metadataName] = + idByUniversalIdentifier; + } + const flatEntityMapsKey = getMetadataFlatEntityMapsKey(metadataName); const flatEntityMaps = allRelatedFlatEntityMaps[flatEntityMapsKey]; // @ts-expect-error Metadata flat entity maps cache key and metadataName colliding - fromToAllFlatEntityMaps[flatEntityMapsKey] = computeFlatEntityMapsFromTo({ - flatEntityMaps, - flatEntityToCreate, - flatEntityToDelete, - flatEntityToUpdate, - }); + fromToAllFlatEntityMaps[flatEntityMapsKey] = + computeUniversalFlatEntityMapsFromTo({ + flatEntityMaps, + flatEntityToCreate, + flatEntityToDelete, + flatEntityToUpdate, + }); if (flatEntityToDelete.length > 0) { inferDeletionFromMissingEntities[metadataName] = true; @@ -180,15 +207,20 @@ export class WorkspaceMigrationValidateBuildAndRunService { inferDeletionFromMissingEntities, dependencyAllFlatEntityMaps, additionalCacheDataMaps, + idByUniversalIdentifierByMetadataName, }; } public async validateBuildAndRunWorkspaceMigrationFromTo( - args: WorkspaceMigrationOrchestratorBuildArgs, + args: WorkspaceMigrationOrchestratorBuildArgs & { + idByUniversalIdentifierByMetadataName?: IdByUniversalIdentifierByMetadataName; + }, ) { + const { idByUniversalIdentifierByMetadataName, ...buildArgs } = args; + const validateAndBuildResult = await this.workspaceMigrationBuildOrchestratorService - .buildWorkspaceMigration(args) + .buildWorkspaceMigration(buildArgs) .catch((error) => { this.logger.error(error); throw new WorkspaceMigrationV2Exception( @@ -205,16 +237,18 @@ export class WorkspaceMigrationValidateBuildAndRunService { return validateAndBuildResult; } - // Note: This should be removed once we've refactored the runner optimistic rendering - // As with the current implementation passing an empty workspace migration might result - // in dependency flat entity maps invalidation if (validateAndBuildResult.workspaceMigration.actions.length === 0) { - return; + return undefined; } - await this.workspaceMigrationRunnerService.run( - validateAndBuildResult.workspaceMigration, - ); + const workspaceMigration = isDefined(idByUniversalIdentifierByMetadataName) + ? enrichCreateWorkspaceMigrationActionsWithIds({ + idByUniversalIdentifierByMetadataName, + workspaceMigration: validateAndBuildResult.workspaceMigration, + }) + : validateAndBuildResult.workspaceMigration; + + await this.workspaceMigrationRunnerService.run(workspaceMigration); } public async validateBuildAndRunWorkspaceMigration({ @@ -230,6 +264,7 @@ export class WorkspaceMigrationValidateBuildAndRunService { inferDeletionFromMissingEntities, dependencyAllFlatEntityMaps, additionalCacheDataMaps, + idByUniversalIdentifierByMetadataName, } = await this.computeFromToAllFlatEntityMapsAndBuildOptions({ allFlatEntityOperationByMetadataName: allFlatEntities, workspaceId, @@ -246,6 +281,7 @@ export class WorkspaceMigrationValidateBuildAndRunService { workspaceId, dependencyAllFlatEntityMaps, additionalCacheDataMaps, + idByUniversalIdentifierByMetadataName, }); } } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type.ts index 20163daef1..f01c039078 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type.ts @@ -1,7 +1,7 @@ -import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; import { type OrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type'; +import { type MetadataUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-maps.type'; export type AggregateOrchestratorActionsReportArgs = { orchestratorActionsReport: OrchestratorActionsReport; - flatFieldMetadataMaps?: MetadataFlatEntityMaps<'fieldMetadata'>; + flatFieldMetadataMaps?: MetadataUniversalFlatEntityMaps<'fieldMetadata'>; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type.ts index aa53ae7161..e05ed03714 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type.ts @@ -1,25 +1,27 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; import { type FromTo } from 'twenty-shared/types'; -import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { type MetadataUniversalWorkspaceMigrationActionsRecord, type WorkspaceMigrationActionType, } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type'; import { type WorkspaceMigrationBuilderAdditionalCacheDataMaps } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-builder-additional-cache-data-maps.type'; +import { type AllUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/all-universal-flat-entity-maps.type'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { type WorkspaceMigration } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration'; import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-builder-options.type'; export type FromToAllFlatEntityMaps = { - [P in keyof AllFlatEntityMaps]?: FromTo; + [P in keyof AllUniversalFlatEntityMaps]?: FromTo< + AllUniversalFlatEntityMaps[P] + >; }; export type WorkspaceMigrationOrchestratorBuildArgs = { workspaceId: string; buildOptions: WorkspaceMigrationBuilderOptions; fromToAllFlatEntityMaps: FromToAllFlatEntityMaps; - dependencyAllFlatEntityMaps?: Partial; + dependencyAllFlatEntityMaps?: Partial; additionalCacheDataMaps: WorkspaceMigrationBuilderAdditionalCacheDataMaps; applicationUniversalIdentifier: string; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/all-jsonb-properties-with-serialized-relation-by-metadata-name.constant.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/all-jsonb-properties-with-serialized-relation-by-metadata-name.constant.ts index a46c460bd9..d987efddd7 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/all-jsonb-properties-with-serialized-relation-by-metadata-name.constant.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/all-jsonb-properties-with-serialized-relation-by-metadata-name.constant.ts @@ -3,6 +3,10 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; import { type MetadataEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-entity.type'; import { type ExtractJsonbProperties } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/extract-jsonb-properties.type'; +/** + * Important notice: This file is not strictly typed and needs manual referencement + * of jsonb properties that may contain a serialized relation + */ export const ALL_JSONB_PROPERTIES_WITH_SERIALIZED_RELATION_BY_METADATA_NAME = { fieldMetadata: { settings: 'settings', @@ -32,6 +36,7 @@ export const ALL_JSONB_PROPERTIES_WITH_SERIALIZED_RELATION_BY_METADATA_NAME = { frontComponent: {}, } as const satisfies { [P in AllMetadataName]: Partial<{ + // TODO prastoin: improve strict typing to recursively serach for nested SerializedRelation [K in ExtractJsonbProperties>]: K; }>; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/all-universal-metadata-relations.constant.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/all-universal-metadata-relations.constant.ts new file mode 100644 index 0000000000..2e19679a73 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/all-universal-metadata-relations.constant.ts @@ -0,0 +1,517 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type ALL_METADATA_RELATIONS } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-relations.constant'; + +export type ToUniversalForeignKey = + T extends `${infer Prefix}Id` ? `${Prefix}UniversalIdentifier` : never; + +type ToUniversalAggregator = T extends `${infer Prefix}Ids` + ? `${Prefix}UniversalIdentifiers` + : never; + +export type ToUniversalMetadataManyToOneRelationConfiguration = T extends { + metadataName: infer M extends AllMetadataName; + foreignKey: infer FK extends string; + flatEntityForeignKeyAggregator: infer Agg; + isNullable: infer N extends boolean; +} + ? { + metadataName: M; + foreignKey: FK; + universalForeignKey: ToUniversalForeignKey; + universalFlatEntityForeignKeyAggregator: Agg extends string + ? ToUniversalAggregator + : null; + isNullable: N; + } + : null; + +type ToUniversalManyToOneRelations = { + [K in keyof T]: ToUniversalMetadataManyToOneRelationConfiguration; +}; + +type ToUniversalOneToManyRelations = T; + +export type UniversalMetadataRelationsProperties = { + [M in AllMetadataName]: { + manyToOne: ToUniversalManyToOneRelations< + (typeof ALL_METADATA_RELATIONS)[M]['manyToOne'] + >; + oneToMany: ToUniversalOneToManyRelations< + (typeof ALL_METADATA_RELATIONS)[M]['oneToMany'] + >; + }; +}; + +export const ALL_UNIVERSAL_METADATA_RELATIONS = { + agent: { + manyToOne: { + workspace: null, + application: null, + }, + oneToMany: {}, + }, + skill: { + manyToOne: { + workspace: null, + application: null, + }, + oneToMany: {}, + }, + commandMenuItem: { + manyToOne: { + workspace: null, + application: null, + availabilityObjectMetadata: { + metadataName: 'objectMetadata', + foreignKey: 'availabilityObjectMetadataId', + universalFlatEntityForeignKeyAggregator: null, + universalForeignKey: 'availabilityObjectMetadataUniversalIdentifier', + isNullable: true, + }, + frontComponent: { + metadataName: 'frontComponent', + foreignKey: 'frontComponentId', + universalFlatEntityForeignKeyAggregator: null, + universalForeignKey: 'frontComponentUniversalIdentifier', + isNullable: true, + }, + }, + oneToMany: {}, + }, + navigationMenuItem: { + manyToOne: { + workspace: null, + userWorkspace: null, + application: null, + targetObjectMetadata: { + metadataName: 'objectMetadata', + foreignKey: 'targetObjectMetadataId', + universalFlatEntityForeignKeyAggregator: null, + universalForeignKey: 'targetObjectMetadataUniversalIdentifier', + isNullable: true, + }, + folder: { + metadataName: 'navigationMenuItem', + foreignKey: 'folderId', + universalFlatEntityForeignKeyAggregator: null, + universalForeignKey: 'folderUniversalIdentifier', + isNullable: true, + }, + view: { + metadataName: 'view', + foreignKey: 'viewId', + universalFlatEntityForeignKeyAggregator: null, + universalForeignKey: 'viewUniversalIdentifier', + isNullable: true, + }, + }, + oneToMany: {}, + }, + fieldMetadata: { + manyToOne: { + object: { + metadataName: 'objectMetadata', + foreignKey: 'objectMetadataId', + universalFlatEntityForeignKeyAggregator: 'fieldUniversalIdentifiers', + universalForeignKey: 'objectMetadataUniversalIdentifier', + isNullable: false, + }, + workspace: null, + application: null, + relationTargetFieldMetadata: { + metadataName: 'fieldMetadata', + foreignKey: 'relationTargetFieldMetadataId', + universalFlatEntityForeignKeyAggregator: null, + universalForeignKey: 'relationTargetFieldMetadataUniversalIdentifier', + isNullable: true, + }, + relationTargetObjectMetadata: { + metadataName: 'objectMetadata', + foreignKey: 'relationTargetObjectMetadataId', + universalFlatEntityForeignKeyAggregator: null, + universalForeignKey: 'relationTargetObjectMetadataUniversalIdentifier', + isNullable: true, + }, + }, + oneToMany: { + fieldPermissions: null, + indexFieldMetadatas: null, + viewFields: { metadataName: 'viewField' }, + viewFilters: { metadataName: 'viewFilter' }, + kanbanAggregateOperationViews: { metadataName: 'view' }, + calendarViews: { metadataName: 'view' }, + mainGroupByFieldMetadataViews: { metadataName: 'view' }, + }, + }, + objectMetadata: { + manyToOne: { + dataSource: null, + workspace: null, + application: null, + }, + oneToMany: { + fields: { metadataName: 'fieldMetadata' }, + indexMetadatas: { metadataName: 'index' }, + targetRelationFields: { metadataName: 'fieldMetadata' }, + objectPermissions: null, + fieldPermissions: null, + views: { metadataName: 'view' }, + }, + }, + view: { + manyToOne: { + objectMetadata: { + metadataName: 'objectMetadata', + foreignKey: 'objectMetadataId', + universalFlatEntityForeignKeyAggregator: 'viewUniversalIdentifiers', + universalForeignKey: 'objectMetadataUniversalIdentifier', + isNullable: false, + }, + workspace: null, + createdBy: null, + application: null, + calendarFieldMetadata: { + metadataName: 'fieldMetadata', + foreignKey: 'calendarFieldMetadataId', + universalFlatEntityForeignKeyAggregator: + 'calendarViewUniversalIdentifiers', + universalForeignKey: 'calendarFieldMetadataUniversalIdentifier', + isNullable: true, + }, + kanbanAggregateOperationFieldMetadata: { + metadataName: 'fieldMetadata', + foreignKey: 'kanbanAggregateOperationFieldMetadataId', + universalFlatEntityForeignKeyAggregator: + 'kanbanAggregateOperationViewUniversalIdentifiers', + universalForeignKey: + 'kanbanAggregateOperationFieldMetadataUniversalIdentifier', + isNullable: true, + }, + mainGroupByFieldMetadata: { + metadataName: 'fieldMetadata', + foreignKey: 'mainGroupByFieldMetadataId', + universalFlatEntityForeignKeyAggregator: + 'mainGroupByFieldMetadataViewUniversalIdentifiers', + universalForeignKey: 'mainGroupByFieldMetadataUniversalIdentifier', + isNullable: true, + }, + }, + oneToMany: { + viewFields: { metadataName: 'viewField' }, + viewFilters: { metadataName: 'viewFilter' }, + viewFilterGroups: { metadataName: 'viewFilterGroup' }, + viewGroups: { metadataName: 'viewGroup' }, + // TODO migrate viewSort to v2 + viewSorts: null, + }, + }, + viewField: { + manyToOne: { + fieldMetadata: { + metadataName: 'fieldMetadata', + foreignKey: 'fieldMetadataId', + universalFlatEntityForeignKeyAggregator: + 'viewFieldUniversalIdentifiers', + universalForeignKey: 'fieldMetadataUniversalIdentifier', + isNullable: false, + }, + view: { + metadataName: 'view', + foreignKey: 'viewId', + universalFlatEntityForeignKeyAggregator: + 'viewFieldUniversalIdentifiers', + universalForeignKey: 'viewUniversalIdentifier', + isNullable: false, + }, + workspace: null, + application: null, + }, + oneToMany: {}, + }, + viewFilter: { + manyToOne: { + fieldMetadata: { + metadataName: 'fieldMetadata', + foreignKey: 'fieldMetadataId', + universalFlatEntityForeignKeyAggregator: + 'viewFilterUniversalIdentifiers', + universalForeignKey: 'fieldMetadataUniversalIdentifier', + isNullable: false, + }, + view: { + metadataName: 'view', + foreignKey: 'viewId', + universalFlatEntityForeignKeyAggregator: + 'viewFilterUniversalIdentifiers', + universalForeignKey: 'viewUniversalIdentifier', + isNullable: false, + }, + viewFilterGroup: { + metadataName: 'viewFilterGroup', + foreignKey: 'viewFilterGroupId', + universalFlatEntityForeignKeyAggregator: + 'viewFilterUniversalIdentifiers', + universalForeignKey: 'viewFilterGroupUniversalIdentifier', + isNullable: true, + }, + workspace: null, + application: null, + }, + oneToMany: {}, + }, + viewGroup: { + manyToOne: { + view: { + metadataName: 'view', + foreignKey: 'viewId', + universalFlatEntityForeignKeyAggregator: + 'viewGroupUniversalIdentifiers', + universalForeignKey: 'viewUniversalIdentifier', + isNullable: false, + }, + workspace: null, + application: null, + }, + oneToMany: {}, + }, + index: { + manyToOne: { + objectMetadata: { + metadataName: 'objectMetadata', + foreignKey: 'objectMetadataId', + universalFlatEntityForeignKeyAggregator: + 'indexMetadataUniversalIdentifiers', + universalForeignKey: 'objectMetadataUniversalIdentifier', + isNullable: false, + }, + workspace: null, + application: null, + }, + oneToMany: { + indexFieldMetadatas: null, + }, + }, + logicFunction: { + manyToOne: { + workspace: null, + application: null, + }, + oneToMany: {}, + }, + role: { + manyToOne: { + workspace: null, + application: null, + }, + oneToMany: { + roleTargets: { metadataName: 'roleTarget' }, + objectPermissions: null, + permissionFlags: null, + fieldPermissions: null, + rowLevelPermissionPredicates: { + metadataName: 'rowLevelPermissionPredicate', + }, + rowLevelPermissionPredicateGroups: { + metadataName: 'rowLevelPermissionPredicateGroup', + }, + }, + }, + roleTarget: { + manyToOne: { + role: { + metadataName: 'role', + foreignKey: 'roleId', + universalFlatEntityForeignKeyAggregator: + 'roleTargetUniversalIdentifiers', + universalForeignKey: 'roleUniversalIdentifier', + isNullable: false, + }, + apiKey: null, + workspace: null, + application: null, + }, + oneToMany: {}, + }, + pageLayout: { + manyToOne: { + workspace: null, + objectMetadata: { + metadataName: 'objectMetadata', + foreignKey: 'objectMetadataId', + universalFlatEntityForeignKeyAggregator: null, + universalForeignKey: 'objectMetadataUniversalIdentifier', + isNullable: true, + }, + application: null, + defaultTabToFocusOnMobileAndSidePanel: { + metadataName: 'pageLayoutTab', + foreignKey: 'defaultTabToFocusOnMobileAndSidePanelId', + universalFlatEntityForeignKeyAggregator: null, + universalForeignKey: + 'defaultTabToFocusOnMobileAndSidePanelUniversalIdentifier', + isNullable: true, + }, + }, + oneToMany: { + tabs: { metadataName: 'pageLayoutTab' }, + }, + }, + pageLayoutTab: { + manyToOne: { + workspace: null, + pageLayout: { + metadataName: 'pageLayout', + foreignKey: 'pageLayoutId', + universalFlatEntityForeignKeyAggregator: 'tabUniversalIdentifiers', + universalForeignKey: 'pageLayoutUniversalIdentifier', + isNullable: false, + }, + application: null, + }, + oneToMany: { + widgets: { metadataName: 'pageLayoutWidget' }, + }, + }, + pageLayoutWidget: { + manyToOne: { + workspace: null, + pageLayoutTab: { + metadataName: 'pageLayoutTab', + foreignKey: 'pageLayoutTabId', + universalFlatEntityForeignKeyAggregator: 'widgetUniversalIdentifiers', + universalForeignKey: 'pageLayoutTabUniversalIdentifier', + isNullable: false, + }, + objectMetadata: { + metadataName: 'objectMetadata', + foreignKey: 'objectMetadataId', + universalFlatEntityForeignKeyAggregator: null, + universalForeignKey: 'objectMetadataUniversalIdentifier', + isNullable: true, + }, + application: null, + }, + oneToMany: {}, + }, + rowLevelPermissionPredicate: { + manyToOne: { + workspace: null, + role: { + metadataName: 'role', + foreignKey: 'roleId', + universalFlatEntityForeignKeyAggregator: null, + universalForeignKey: 'roleUniversalIdentifier', + isNullable: false, + }, + fieldMetadata: { + metadataName: 'fieldMetadata', + foreignKey: 'fieldMetadataId', + universalFlatEntityForeignKeyAggregator: null, + universalForeignKey: 'fieldMetadataUniversalIdentifier', + isNullable: false, + }, + workspaceMemberFieldMetadata: { + metadataName: 'fieldMetadata', + foreignKey: 'workspaceMemberFieldMetadataId', + universalFlatEntityForeignKeyAggregator: null, + universalForeignKey: 'workspaceMemberFieldMetadataUniversalIdentifier', + isNullable: true, + }, + objectMetadata: { + metadataName: 'objectMetadata', + foreignKey: 'objectMetadataId', + universalFlatEntityForeignKeyAggregator: null, + universalForeignKey: 'objectMetadataUniversalIdentifier', + isNullable: false, + }, + rowLevelPermissionPredicateGroup: { + metadataName: 'rowLevelPermissionPredicateGroup', + foreignKey: 'rowLevelPermissionPredicateGroupId', + universalFlatEntityForeignKeyAggregator: null, + universalForeignKey: + 'rowLevelPermissionPredicateGroupUniversalIdentifier', + isNullable: true, + }, + application: null, + }, + oneToMany: {}, + }, + rowLevelPermissionPredicateGroup: { + manyToOne: { + objectMetadata: { + metadataName: 'objectMetadata', + foreignKey: 'objectMetadataId', + universalFlatEntityForeignKeyAggregator: null, + universalForeignKey: 'objectMetadataUniversalIdentifier', + isNullable: false, + }, + role: { + metadataName: 'role', + foreignKey: 'roleId', + universalFlatEntityForeignKeyAggregator: null, + universalForeignKey: 'roleUniversalIdentifier', + isNullable: false, + }, + parentRowLevelPermissionPredicateGroup: { + metadataName: 'rowLevelPermissionPredicateGroup', + foreignKey: 'parentRowLevelPermissionPredicateGroupId', + universalFlatEntityForeignKeyAggregator: + 'childRowLevelPermissionPredicateGroupUniversalIdentifiers', + universalForeignKey: + 'parentRowLevelPermissionPredicateGroupUniversalIdentifier', + isNullable: true, + }, + workspace: null, + application: null, + }, + oneToMany: { + childRowLevelPermissionPredicateGroups: { + metadataName: 'rowLevelPermissionPredicateGroup', + }, + rowLevelPermissionPredicates: { + metadataName: 'rowLevelPermissionPredicate', + }, + }, + }, + viewFilterGroup: { + manyToOne: { + application: null, + parentViewFilterGroup: { + metadataName: 'viewFilterGroup', + foreignKey: 'parentViewFilterGroupId', + universalFlatEntityForeignKeyAggregator: + 'childViewFilterGroupUniversalIdentifiers', + universalForeignKey: 'parentViewFilterGroupUniversalIdentifier', + isNullable: true, + }, + view: { + metadataName: 'view', + foreignKey: 'viewId', + universalFlatEntityForeignKeyAggregator: + 'viewFilterGroupUniversalIdentifiers', + universalForeignKey: 'viewUniversalIdentifier', + isNullable: false, + }, + workspace: null, + }, + oneToMany: { + childViewFilterGroups: { metadataName: 'viewFilterGroup' }, + viewFilters: { metadataName: 'viewFilter' }, + }, + }, + frontComponent: { + manyToOne: { + workspace: null, + application: null, + }, + oneToMany: {}, + }, + webhook: { + manyToOne: { + workspace: null, + application: null, + }, + oneToMany: {}, + }, +} as const satisfies UniversalMetadataRelationsProperties; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/__tests__/metadata-universal-flat-entity-maps.type-test.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/__tests__/metadata-universal-flat-entity-maps.type-test.ts new file mode 100644 index 0000000000..f9fa4528d1 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/__tests__/metadata-universal-flat-entity-maps.type-test.ts @@ -0,0 +1,21 @@ +import { type Equal, type Expect } from 'twenty-shared/testing'; + +import { type MetadataUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-maps.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type UniversalFlatViewField } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-field.type'; + +// eslint-disable-next-line unused-imports/no-unused-vars +type Assertions = [ + Expect< + Equal< + MetadataUniversalFlatEntityMaps<'fieldMetadata'>['byUniversalIdentifier'][string], + UniversalFlatFieldMetadata | undefined + > + >, + Expect< + Equal< + MetadataUniversalFlatEntityMaps<'viewField'>['byUniversalIdentifier'][string], + UniversalFlatViewField | undefined + > + >, +]; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/__tests__/universal-flat-entity-update.test-type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/__tests__/universal-flat-entity-update.test-type.ts new file mode 100644 index 0000000000..0e194561eb --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/__tests__/universal-flat-entity-update.test-type.ts @@ -0,0 +1,39 @@ +import { type Equal, type Expect } from 'twenty-shared/testing'; + +import { type UniversalFlatEntityUpdate } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-update.type'; + +// eslint-disable-next-line unused-imports/no-unused-vars +type Assertions = [ + Expect< + Equal< + keyof UniversalFlatEntityUpdate<'fieldMetadata'>, + | 'name' + | 'label' + | 'icon' + | 'description' + | 'isActive' + | 'defaultValue' + | 'standardOverrides' + | 'options' + | 'isUnique' + | 'isLabelSyncedWithName' + | 'universalSettings' + > + >, + + Expect< + Equal< + keyof UniversalFlatEntityUpdate<'objectMetadata'>, + | 'icon' + | 'description' + | 'isActive' + | 'standardOverrides' + | 'isLabelSyncedWithName' + | 'nameSingular' + | 'namePlural' + | 'labelSingular' + | 'labelPlural' + | 'labelIdentifierFieldMetadataUniversalIdentifier' + > + >, +]; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/all-universal-flat-entity-maps.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/all-universal-flat-entity-maps.type.ts new file mode 100644 index 0000000000..6b49d6f685 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/all-universal-flat-entity-maps.type.ts @@ -0,0 +1,8 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type MetadataToFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/types/metadata-to-flat-entity-maps-key'; +import { type MetadataUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-maps.type'; + +export type AllUniversalFlatEntityMaps = { + [P in AllMetadataName as MetadataToFlatEntityMapsKey

]: MetadataUniversalFlatEntityMaps

; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-maps.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-maps.type.ts new file mode 100644 index 0000000000..69ed89302e --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-maps.type.ts @@ -0,0 +1,9 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type AllFlatEntityTypesByMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; + +export type MetadataUniversalFlatEntityMaps = + UniversalFlatEntityMaps< + AllFlatEntityTypesByMetadataName[T]['universalFlatEntity'] + >; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-properties-to-compare.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-properties-to-compare.type.ts new file mode 100644 index 0000000000..2fa41343c8 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-properties-to-compare.type.ts @@ -0,0 +1,63 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; +import { type Equal, type Expect } from 'twenty-shared/testing'; + +import { type ALL_ENTITY_PROPERTIES_CONFIGURATION_BY_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; +import { type MetadataUniversalFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-universal-flat-entity.type'; + +type ExtractPropertyToCompare< + MetadataConfig, + P extends keyof MetadataConfig, +> = MetadataConfig[P] extends { universalProperty: string } + ? MetadataConfig[P]['universalProperty'] + : P; + +export type MetadataUniversalFlatEntityPropertiesToCompare< + T extends AllMetadataName, + MetadataConfig = (typeof ALL_ENTITY_PROPERTIES_CONFIGURATION_BY_METADATA_NAME)[T], +> = { + [P in keyof MetadataConfig]: ExtractPropertyToCompare; +}[keyof MetadataConfig] & + keyof MetadataUniversalFlatEntity; + +// eslint-disable-next-line unused-imports/no-unused-vars +type Assertions = [ + Expect< + Equal< + MetadataUniversalFlatEntityPropertiesToCompare<'fieldMetadata'>, + | 'name' + | 'label' + | 'icon' + | 'description' + | 'isActive' + | 'defaultValue' + | 'standardOverrides' + | 'options' + | 'isUnique' + | 'isLabelSyncedWithName' + | 'universalSettings' + > + >, + + Expect< + Equal< + MetadataUniversalFlatEntityPropertiesToCompare<'view'>, + | 'name' + | 'icon' + | 'deletedAt' + | 'type' + | 'position' + | 'key' + | 'isCompact' + | 'openRecordIn' + | 'kanbanAggregateOperation' + | 'kanbanAggregateOperationFieldMetadataUniversalIdentifier' + | 'calendarLayout' + | 'calendarFieldMetadataUniversalIdentifier' + | 'mainGroupByFieldMetadataUniversalIdentifier' + | 'shouldHideEmptyGroups' + | 'anyFieldFilterValue' + | 'visibility' + | 'createdByUserWorkspaceId' + > + >, +]; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-properties-to-stringify.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-properties-to-stringify.type.ts new file mode 100644 index 0000000000..e48c348bb6 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-properties-to-stringify.type.ts @@ -0,0 +1,13 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type ALL_ENTITY_PROPERTIES_CONFIGURATION_BY_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-entity-properties-configuration-by-metadata-name.constant'; + +type ExtractKeysWithToStringify = { + [K in keyof T]: T[K] extends { toStringify: true } ? K : never; +}[keyof T]; + +export type MetadataUniversalFlatEntityPropertiesToStringify< + T extends AllMetadataName, +> = ExtractKeysWithToStringify< + (typeof ALL_ENTITY_PROPERTIES_CONFIGURATION_BY_METADATA_NAME)[T] +>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type.ts index 46bf5737f5..0566e36df5 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type.ts @@ -1,9 +1,9 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; +import { type ALL_METADATA_RELATIONS } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-relations.constant'; import { type AddSuffixToEntityManyToOneProperties } from 'src/engine/metadata-modules/flat-entity/types/add-suffix-to-entity-many-to-one-properties.type'; import { type AddSuffixToEntityOneToManyProperties } from 'src/engine/metadata-modules/flat-entity/types/add-suffix-to-entity-one-to-many-properties.type'; import { type CastRecordTypeOrmDatePropertiesToString } from 'src/engine/metadata-modules/flat-entity/types/cast-record-typeorm-date-properties-to-string.type'; -import { type ExtractEntityRelatedEntityProperties } from 'src/engine/metadata-modules/flat-entity/types/extract-entity-related-entity-properties.type'; import { type FromMetadataEntityToMetadataName } from 'src/engine/metadata-modules/flat-entity/types/from-metadata-entity-to-metadata-name.type'; import { type MetadataManyToOneJoinColumn } from 'src/engine/metadata-modules/flat-entity/types/metadata-many-to-one-join-column.type'; import { type SyncableEntity } from 'src/engine/workspace-manager/types/syncable-entity.interface'; @@ -46,7 +46,8 @@ export type UniversalFlatEntityFrom< | 'applicationId' | 'workspaceId' | 'id' - | ExtractEntityRelatedEntityProperties + | keyof (typeof ALL_METADATA_RELATIONS)[TMetadataName]['manyToOne'] + | keyof (typeof ALL_METADATA_RELATIONS)[TMetadataName]['oneToMany'] | Extract, keyof TEntity> | keyof CastRecordTypeOrmDatePropertiesToString | AllJsonbPropertiesWithSerializedPropertiesForMetadataName diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type.ts new file mode 100644 index 0000000000..638555e90c --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type.ts @@ -0,0 +1,8 @@ +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type'; +import { type UniversalSyncableFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; + +export type UniversalFlatEntityMaps< + T extends SyncableFlatEntity | UniversalSyncableFlatEntity, +> = { + byUniversalIdentifier: Partial>; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-update.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-update.type.ts new file mode 100644 index 0000000000..a5b5ef76cd --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-update.type.ts @@ -0,0 +1,11 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type MetadataUniversalFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-universal-flat-entity.type'; +import { type MetadataUniversalFlatEntityPropertiesToCompare } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-properties-to-compare.type'; + +export type UniversalFlatEntityUpdate = Partial< + Pick< + MetadataUniversalFlatEntity, + MetadataUniversalFlatEntityPropertiesToCompare + > +>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type.ts new file mode 100644 index 0000000000..6df59516d2 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type.ts @@ -0,0 +1,23 @@ +import { type CastRecordTypeOrmDatePropertiesToString } from 'src/engine/metadata-modules/flat-entity/types/cast-record-typeorm-date-properties-to-string.type'; +import { type IndexFieldMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-field-metadata.entity'; +import { type IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; +import { type UniversalFlatEntityFrom } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; + +// Note: IndexFieldMetadataEntity is just in between a SyncableEntity and a jsonb we should decide one of both +export type UniversalFlatIndexFieldMetadata = Omit< + IndexFieldMetadataEntity, + | 'indexMetadataId' + | 'indexMetadata' + | 'fieldMetadataId' + | 'fieldMetadata' + | 'id' + | keyof CastRecordTypeOrmDatePropertiesToString +> & { + indexMetadataUniversalIdentifier: string; + fieldMetadataUniversalIdentifier: string; +} & CastRecordTypeOrmDatePropertiesToString; + +export type UniversalFlatIndexMetadata = + UniversalFlatEntityFrom & { + universalFlatIndexFieldMetadatas: UniversalFlatIndexFieldMetadata[]; + }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type.ts index a8fb084ea2..7c417ae5b1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type.ts @@ -2,7 +2,13 @@ import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-me import { type UniversalFlatEntityFrom } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; export type UniversalFlatObjectMetadata = UniversalFlatEntityFrom< - Omit, + Omit< + ObjectMetadataEntity, + | 'targetRelationFields' + | 'dataSourceId' + | 'labelIdentifierFieldMetadataId' + | 'imageIdentifierFieldMetadataId' + >, 'objectMetadata' > & { // NOTE: below fields are not reflected on the final UniversalFlatEntity either they should we should define a common source diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-skill.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-skill.type.ts new file mode 100644 index 0000000000..0da1f73014 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-skill.type.ts @@ -0,0 +1,4 @@ +import { type SkillEntity } from 'src/engine/metadata-modules/skill/entities/skill.entity'; +import { type UniversalFlatEntityFrom } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; + +export type UniversalFlatSkill = UniversalFlatEntityFrom; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-field.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-field.type.ts new file mode 100644 index 0000000000..9e13124dad --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-field.type.ts @@ -0,0 +1,7 @@ +import { type ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; +import { type UniversalFlatEntityFrom } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; + +export type UniversalFlatViewField = UniversalFlatEntityFrom< + ViewFieldEntity, + 'viewField' +>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-filter-group.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-filter-group.type.ts new file mode 100644 index 0000000000..392a16e6c2 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-filter-group.type.ts @@ -0,0 +1,7 @@ +import { type ViewFilterGroupEntity } from 'src/engine/metadata-modules/view-filter-group/entities/view-filter-group.entity'; +import { type UniversalFlatEntityFrom } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; + +export type UniversalFlatViewFilterGroup = UniversalFlatEntityFrom< + ViewFilterGroupEntity, + 'viewFilterGroup' +>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-filter.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-filter.type.ts new file mode 100644 index 0000000000..d67a70e2ec --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-filter.type.ts @@ -0,0 +1,7 @@ +import { type ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; +import { type UniversalFlatEntityFrom } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; + +export type UniversalFlatViewFilter = UniversalFlatEntityFrom< + ViewFilterEntity, + 'viewFilter' +>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-group.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-group.type.ts new file mode 100644 index 0000000000..890f4f9a0e --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-group.type.ts @@ -0,0 +1,7 @@ +import { type ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; +import { type UniversalFlatEntityFrom } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; + +export type UniversalFlatViewGroup = UniversalFlatEntityFrom< + ViewGroupEntity, + 'viewGroup' +>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view.type.ts new file mode 100644 index 0000000000..2fadc95c06 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view.type.ts @@ -0,0 +1,8 @@ +import { type ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; +import { type UniversalFlatEntityFrom } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; + +// TODO remove once viewSorts has been migrated to v2 +export type UniversalFlatView = UniversalFlatEntityFrom< + Omit, + 'view' +>; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/__snapshots__/compare-two-flat-entity.util.spec.ts.snap b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/__snapshots__/compare-two-universal-flat-entity.util.spec.ts.snap similarity index 100% rename from packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/__snapshots__/compare-two-flat-entity.util.spec.ts.snap rename to packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/__snapshots__/compare-two-universal-flat-entity.util.spec.ts.snap diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/__tests__/__snapshots__/sanitize-flat-entity-update.util.spec.ts.snap b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/__snapshots__/sanitize-universal-flat-entity-update.util.spec.ts.snap similarity index 100% rename from packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/__tests__/__snapshots__/sanitize-flat-entity-update.util.spec.ts.snap rename to packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/__snapshots__/sanitize-universal-flat-entity-update.util.spec.ts.snap diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/__snapshots__/flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts.snap b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/__snapshots__/universal-flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts.snap similarity index 86% rename from packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/__snapshots__/flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts.snap rename to packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/__snapshots__/universal-flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts.snap index 8d82503891..823161bdd1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/__snapshots__/flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts.snap +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/__snapshots__/universal-flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect a created entity 1`] = ` { @@ -48,19 +48,9 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect a crea "workspaceId": "workspace-id-1", }, }, - "universalIdentifierById": { - "field-id-1": "universal-identifier-1", - }, - "universalIdentifiersByApplicationId": { - "application-id-1": [ - "universal-identifier-1", - ], - }, }, "deletedFlatEntityMaps": { "byUniversalIdentifier": {}, - "universalIdentifierById": {}, - "universalIdentifiersByApplicationId": {}, }, "updatedFlatEntityMaps": { "byUniversalIdentifier": {}, @@ -72,8 +62,6 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect a dele { "createdFlatEntityMaps": { "byUniversalIdentifier": {}, - "universalIdentifierById": {}, - "universalIdentifiersByApplicationId": {}, }, "deletedFlatEntityMaps": { "byUniversalIdentifier": { @@ -121,14 +109,6 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect a dele "workspaceId": "workspace-id-1", }, }, - "universalIdentifierById": { - "field-id-1": "universal-identifier-1", - }, - "universalIdentifiersByApplicationId": { - "application-id-1": [ - "universal-identifier-1", - ], - }, }, "updatedFlatEntityMaps": { "byUniversalIdentifier": {}, @@ -140,18 +120,13 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect an upd { "createdFlatEntityMaps": { "byUniversalIdentifier": {}, - "universalIdentifierById": {}, - "universalIdentifiersByApplicationId": {}, }, "deletedFlatEntityMaps": { "byUniversalIdentifier": {}, - "universalIdentifierById": {}, - "universalIdentifiersByApplicationId": {}, }, "updatedFlatEntityMaps": { "byUniversalIdentifier": { "universal-identifier-1": { - "id": "field-id-1", "update": { "isActive": true, }, @@ -209,14 +184,6 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect create "workspaceId": "workspace-id-1", }, }, - "universalIdentifierById": { - "field-id-3": "universal-identifier-3", - }, - "universalIdentifiersByApplicationId": { - "application-id-1": [ - "universal-identifier-3", - ], - }, }, "deletedFlatEntityMaps": { "byUniversalIdentifier": { @@ -264,19 +231,10 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect create "workspaceId": "workspace-id-1", }, }, - "universalIdentifierById": { - "field-id-2": "universal-identifier-2", - }, - "universalIdentifiersByApplicationId": { - "application-id-1": [ - "universal-identifier-2", - ], - }, }, "updatedFlatEntityMaps": { "byUniversalIdentifier": { "universal-identifier-1": { - "id": "field-id-1", "update": { "isActive": false, }, @@ -290,13 +248,9 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should not detect de { "createdFlatEntityMaps": { "byUniversalIdentifier": {}, - "universalIdentifierById": {}, - "universalIdentifiersByApplicationId": {}, }, "deletedFlatEntityMaps": { "byUniversalIdentifier": {}, - "universalIdentifierById": {}, - "universalIdentifiersByApplicationId": {}, }, "updatedFlatEntityMaps": { "byUniversalIdentifier": {}, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/add-universal-flat-entity-to-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.spec.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/add-universal-flat-entity-to-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.spec.ts new file mode 100644 index 0000000000..1eb5b43035 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/add-universal-flat-entity-to-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.spec.ts @@ -0,0 +1,239 @@ +import { FieldMetadataType } from 'twenty-shared/types'; + +import { + FlatEntityMapsException, + FlatEntityMapsExceptionCode, +} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; +import { type MetadataUniversalFlatEntityAndRelatedFlatEntityMapsForValidation } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-and-related-flat-entity-maps-for-validation.type'; +import { type MetadataUniversalFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-universal-flat-entity.type'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; +import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; +import { addUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util'; +import { addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-maps-through-mutation-or-throw.util'; + +const createEmptyUniversalFlatEntityMaps = (): UniversalFlatEntityMaps< + T & { universalIdentifier: string; applicationUniversalIdentifier: string } +> => ({ + byUniversalIdentifier: {}, +}); + +describe('addUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow', () => { + it('should add a view and update related objectMetadata with viewUniversalIdentifier', () => { + const objectMetadataUniversalIdentifier = 'object-universal-1'; + const fieldMetadataUniversalIdentifier = 'field-universal-1'; + const viewUniversalIdentifier = 'view-universal-1'; + const applicationUniversalIdentifier = + '20202020-f3ad-452e-b5b6-2d49d3ea88b1'; + + const mockUniversalObjectMetadata = { + universalIdentifier: objectMetadataUniversalIdentifier, + viewUniversalIdentifiers: [], + fieldUniversalIdentifiers: [], + indexMetadataUniversalIdentifiers: [], + description: 'default flat object metadata description', + icon: 'icon', + isActive: true, + isAuditLogged: true, + isCustom: true, + isLabelSyncedWithName: false, + isRemote: false, + isSearchable: true, + isSystem: false, + isUIReadOnly: false, + labelPlural: 'default flat object metadata label plural', + labelSingular: 'default flat object metadata label singular', + namePlural: 'defaultflatObjectMetadataNamePlural', + nameSingular: 'defaultflatObjectMetadataNameSingular', + shortcut: 'shortcut', + standardOverrides: null, + targetTableName: '', + createdAt: '2024-01-01T00:00:00.000Z', + updatedAt: '2024-01-01T00:00:00.000Z', + duplicateCriteria: null, + applicationUniversalIdentifier, + labelIdentifierFieldMetadataUniversalIdentifier: + '20202020-1a62-405c-87fa-4d4fd215851b', + imageIdentifierFieldMetadataUniversalIdentifier: + '20202020-9d65-415f-b0e1-216a2e257ea4', + }; + + const mockUniversalFieldMetadata = { + universalIdentifier: fieldMetadataUniversalIdentifier, + objectMetadataUniversalIdentifier, + type: FieldMetadataType.DATE, + applicationUniversalIdentifier, + viewFieldUniversalIdentifiers: [], + viewFilterUniversalIdentifiers: [], + calendarViewUniversalIdentifiers: [], + mainGroupByFieldMetadataViewUniversalIdentifiers: [], + kanbanAggregateOperationViewUniversalIdentifiers: [], + createdAt: '2024-01-01T00:00:00.000Z', + updatedAt: '2024-01-01T00:00:00.000Z', + defaultValue: null, + options: null, + morphId: null, + settings: null, + universalSettings: null, + description: 'default flat field metadata description', + icon: 'icon', + isActive: true, + isCustom: true, + name: 'flatFieldMetadataName', + label: 'flat field metadata label', + isNullable: true, + isUnique: false, + isUIReadOnly: false, + isLabelSyncedWithName: false, + isSystem: false, + standardOverrides: null, + relationTargetObjectMetadataUniversalIdentifier: null, + relationTargetFieldMetadataUniversalIdentifier: null, + }; + + const mockUniversalView = { + universalIdentifier: viewUniversalIdentifier, + objectMetadataUniversalIdentifier, + viewFieldUniversalIdentifiers: [], + viewFilterUniversalIdentifiers: [], + viewGroupUniversalIdentifiers: [], + applicationUniversalIdentifier, + calendarFieldMetadataUniversalIdentifier: + fieldMetadataUniversalIdentifier, + createdAt: '2024-01-01T00:00:00.000Z', + updatedAt: '2024-01-01T00:00:00.000Z', + name: 'Test View', + type: 'table', + icon: 'IconList', + isCompact: false, + position: 0, + key: null, + kanbanFieldMetadataUniversalIdentifier: null, + kanbanAggregateOperationFieldMetadataUniversalIdentifier: null, + kanbanAggregateOperation: null, + mainGroupByFieldMetadataUniversalIdentifier: null, + viewFilterGroupUniversalIdentifiers: [], + rowLevelPermissionPredicateGroupUniversalIdentifiers: [], + }; + + const flatObjectMetadataMaps = + createEmptyUniversalFlatEntityMaps(); + + addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow({ + universalFlatEntity: mockUniversalObjectMetadata, + universalFlatEntityMapsToMutate: flatObjectMetadataMaps, + }); + + const flatFieldMetadataMaps = + createEmptyUniversalFlatEntityMaps(); + + addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow({ + universalFlatEntity: mockUniversalFieldMetadata, + universalFlatEntityMapsToMutate: flatFieldMetadataMaps, + }); + + const universalFlatEntityAndRelatedMapsToMutate = { + flatFieldMetadataMaps, + flatObjectMetadataMaps, + flatViewMaps: + createEmptyUniversalFlatEntityMaps(), + } as unknown as MetadataUniversalFlatEntityAndRelatedFlatEntityMapsForValidation<'view'>; + + addUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow( + { + metadataName: 'view', + universalFlatEntity: + mockUniversalView as unknown as MetadataUniversalFlatEntity<'view'>, + universalFlatEntityAndRelatedMapsToMutate, + }, + ); + + expect( + findFlatEntityByUniversalIdentifier({ + universalIdentifier: viewUniversalIdentifier, + flatEntityMaps: + universalFlatEntityAndRelatedMapsToMutate.flatViewMaps as UniversalFlatEntityMaps, + }), + ).toMatchObject({ + universalIdentifier: viewUniversalIdentifier, + }); + + const updatedObjectMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: objectMetadataUniversalIdentifier, + flatEntityMaps: + universalFlatEntityAndRelatedMapsToMutate.flatObjectMetadataMaps as UniversalFlatEntityMaps, + }); + + expect(updatedObjectMetadata).toMatchObject({ + viewUniversalIdentifiers: [viewUniversalIdentifier], + }); + + const updatedFieldMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: fieldMetadataUniversalIdentifier, + flatEntityMaps: + universalFlatEntityAndRelatedMapsToMutate.flatFieldMetadataMaps as UniversalFlatEntityMaps, + }); + + expect(updatedFieldMetadata).toMatchObject({ + calendarViewUniversalIdentifiers: [viewUniversalIdentifier], + }); + }); + + it('should throw when related entity is not found', () => { + const viewUniversalIdentifier = 'view-universal-1'; + const nonExistentObjectMetadataUniversalIdentifier = + 'non-existent-object-universal'; + const applicationUniversalIdentifier = + '20202020-f3ad-452e-b5b6-2d49d3ea88b1'; + + const mockUniversalView = { + universalIdentifier: viewUniversalIdentifier, + objectMetadataUniversalIdentifier: + nonExistentObjectMetadataUniversalIdentifier, + viewFieldUniversalIdentifiers: [], + viewFilterUniversalIdentifiers: [], + viewGroupUniversalIdentifiers: [], + applicationUniversalIdentifier, + calendarFieldMetadataUniversalIdentifier: null, + createdAt: '2024-01-01T00:00:00.000Z', + updatedAt: '2024-01-01T00:00:00.000Z', + name: 'Test View', + type: 'table', + icon: 'IconList', + isCompact: false, + position: 0, + key: null, + kanbanFieldMetadataUniversalIdentifier: null, + kanbanAggregateOperationFieldMetadataUniversalIdentifier: null, + kanbanAggregateOperation: null, + mainGroupByFieldMetadataUniversalIdentifier: null, + viewFilterGroupUniversalIdentifiers: [], + rowLevelPermissionPredicateGroupUniversalIdentifiers: [], + }; + + const universalFlatEntityAndRelatedMapsToMutate = { + flatFieldMetadataMaps: createEmptyUniversalFlatEntityMaps(), + flatObjectMetadataMaps: createEmptyUniversalFlatEntityMaps(), + flatViewMaps: + createEmptyUniversalFlatEntityMaps(), + } as unknown as MetadataUniversalFlatEntityAndRelatedFlatEntityMapsForValidation<'view'>; + + expect(() => + addUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow( + { + metadataName: 'view', + universalFlatEntity: + mockUniversalView as unknown as MetadataUniversalFlatEntity<'view'>, + universalFlatEntityAndRelatedMapsToMutate, + }, + ), + ).toThrow( + new FlatEntityMapsException( + `Could not find flat entity with universal identifier ${nonExistentObjectMetadataUniversalIdentifier}`, + FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND, + ), + ); + }); +}); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/compare-two-flat-entity.util.spec.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/compare-two-universal-flat-entity.util.spec.ts similarity index 65% rename from packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/compare-two-flat-entity.util.spec.ts rename to packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/compare-two-universal-flat-entity.util.spec.ts index 72e0bf93c6..c0426a156c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/compare-two-flat-entity.util.spec.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/compare-two-universal-flat-entity.util.spec.ts @@ -6,14 +6,13 @@ import { } from 'twenty-shared/testing'; import { FieldMetadataType, type FromTo } from 'twenty-shared/types'; -import { ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY } from 'src/engine/metadata-modules/flat-entity/constant/all-flat-entity-properties-to-compare-and-stringify.constant'; -import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; -import { compareTwoFlatEntity } from 'src/engine/metadata-modules/flat-entity/utils/compare-two-flat-entity.util'; +import { type MetadataUniversalFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-universal-flat-entity.type'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { compareTwoFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/compare-two-universal-flat-entity.util'; type TestContext = FromTo< - MetadataFlatEntity, - 'flatEntity' + MetadataUniversalFlatEntity, + 'universalFlatEntity' > & { metadataName: T }; describe('compareTwoFlatEntity', () => { @@ -22,14 +21,14 @@ describe('compareTwoFlatEntity', () => { title: 'It should detect flat field metadata isActive diff from true to false', context: { - fromFlatEntity: getFlatFieldMetadataMock({ + fromUniversalFlatEntity: getFlatFieldMetadataMock({ objectMetadataId: 'object-metadata-id', type: FieldMetadataType.TEXT, universalIdentifier: 'universal-identifier', isActive: true, }), metadataName: 'fieldMetadata', - toFlatEntity: getFlatFieldMetadataMock({ + toUniversalFlatEntity: getFlatFieldMetadataMock({ objectMetadataId: 'object-metadata-id', type: FieldMetadataType.TEXT, universalIdentifier: 'universal-identifier', @@ -41,14 +40,14 @@ describe('compareTwoFlatEntity', () => { title: 'It should detect flat field metadata isActive diff from true to false', context: { - fromFlatEntity: getFlatFieldMetadataMock({ + fromUniversalFlatEntity: getFlatFieldMetadataMock({ objectMetadataId: 'object-metadata-id', type: FieldMetadataType.TEXT, universalIdentifier: 'universal-identifier', isActive: false, }), metadataName: 'fieldMetadata', - toFlatEntity: getFlatFieldMetadataMock({ + toUniversalFlatEntity: getFlatFieldMetadataMock({ objectMetadataId: 'object-metadata-id', type: FieldMetadataType.TEXT, universalIdentifier: 'universal-identifier', @@ -60,16 +59,13 @@ describe('compareTwoFlatEntity', () => { test.each(eachTestingContextFilter(testCases))( '$title', - ({ context: { metadataName, fromFlatEntity, toFlatEntity } }) => { + ({ + context: { metadataName, fromUniversalFlatEntity, toUniversalFlatEntity }, + }) => { const result = compareTwoFlatEntity({ - fromFlatEntity, - propertiesToCompare: - ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY[metadataName] - .propertiesToCompare as any, - propertiesToStringify: - ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY[metadataName] - .propertiesToStringify as any, - toFlatEntity, + fromUniversalFlatEntity, + toUniversalFlatEntity, + metadataName, }); expect(result).toMatchSnapshot( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/delete-universal-flat-entity-from-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.spec.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/delete-universal-flat-entity-from-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.spec.ts new file mode 100644 index 0000000000..0ce6e1e44b --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/delete-universal-flat-entity-from-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.spec.ts @@ -0,0 +1,192 @@ +import { FieldMetadataType } from 'twenty-shared/types'; + +import { type MetadataUniversalFlatEntityAndRelatedFlatEntityMapsForValidation } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-and-related-flat-entity-maps-for-validation.type'; +import { type MetadataUniversalFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-universal-flat-entity.type'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; +import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; +import { addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-maps-through-mutation-or-throw.util'; +import { deleteUniversalFlatEntityFromUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/delete-universal-flat-entity-from-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util'; + +const createEmptyUniversalFlatEntityMaps = (): UniversalFlatEntityMaps< + T & { universalIdentifier: string; applicationUniversalIdentifier: string } +> => ({ + byUniversalIdentifier: {}, +}); + +describe('deleteUniversalFlatEntityFromUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow', () => { + it('should delete a view and update related objectMetadata by removing viewUniversalIdentifier', () => { + const objectMetadataUniversalIdentifier = 'object-universal-1'; + const fieldMetadataUniversalIdentifier = 'field-universal-1'; + const viewUniversalIdentifier = 'view-universal-1'; + const applicationUniversalIdentifier = + '20202020-f3ad-452e-b5b6-2d49d3ea88b1'; + + const mockUniversalObjectMetadata = { + universalIdentifier: objectMetadataUniversalIdentifier, + viewUniversalIdentifiers: [viewUniversalIdentifier], + fieldUniversalIdentifiers: [], + indexMetadataUniversalIdentifiers: [], + description: 'default flat object metadata description', + icon: 'icon', + isActive: true, + isAuditLogged: true, + isCustom: true, + isLabelSyncedWithName: false, + isRemote: false, + isSearchable: true, + isSystem: false, + isUIReadOnly: false, + labelPlural: 'default flat object metadata label plural', + labelSingular: 'default flat object metadata label singular', + namePlural: 'defaultflatObjectMetadataNamePlural', + nameSingular: 'defaultflatObjectMetadataNameSingular', + shortcut: 'shortcut', + standardOverrides: null, + targetTableName: '', + createdAt: '2024-01-01T00:00:00.000Z', + updatedAt: '2024-01-01T00:00:00.000Z', + duplicateCriteria: null, + applicationUniversalIdentifier, + labelIdentifierFieldMetadataUniversalIdentifier: + '20202020-1a62-405c-87fa-4d4fd215851b', + imageIdentifierFieldMetadataUniversalIdentifier: + '20202020-9d65-415f-b0e1-216a2e257ea4', + }; + + const mockUniversalFieldMetadata = { + universalIdentifier: fieldMetadataUniversalIdentifier, + objectMetadataUniversalIdentifier, + type: FieldMetadataType.DATE, + applicationUniversalIdentifier, + viewFieldUniversalIdentifiers: [], + viewFilterUniversalIdentifiers: [], + calendarViewUniversalIdentifiers: [viewUniversalIdentifier], + mainGroupByFieldMetadataViewUniversalIdentifiers: [], + kanbanAggregateOperationViewUniversalIdentifiers: [], + createdAt: '2024-01-01T00:00:00.000Z', + updatedAt: '2024-01-01T00:00:00.000Z', + defaultValue: null, + options: null, + morphId: null, + settings: null, + universalSettings: null, + description: 'default flat field metadata description', + icon: 'icon', + isActive: true, + isCustom: true, + name: 'flatFieldMetadataName', + label: 'flat field metadata label', + isNullable: true, + isUnique: false, + isUIReadOnly: false, + isLabelSyncedWithName: false, + isSystem: false, + standardOverrides: null, + relationTargetObjectMetadataUniversalIdentifier: null, + relationTargetFieldMetadataUniversalIdentifier: null, + }; + + const mockUniversalView = { + universalIdentifier: viewUniversalIdentifier, + objectMetadataUniversalIdentifier, + viewFieldUniversalIdentifiers: [], + viewFilterUniversalIdentifiers: [], + viewGroupUniversalIdentifiers: [], + applicationUniversalIdentifier, + calendarFieldMetadataUniversalIdentifier: + fieldMetadataUniversalIdentifier, + createdAt: '2024-01-01T00:00:00.000Z', + updatedAt: '2024-01-01T00:00:00.000Z', + name: 'Test View', + type: 'table', + icon: 'IconList', + isCompact: false, + position: 0, + key: null, + kanbanFieldMetadataUniversalIdentifier: null, + kanbanAggregateOperationFieldMetadataUniversalIdentifier: null, + kanbanAggregateOperation: null, + mainGroupByFieldMetadataUniversalIdentifier: null, + viewFilterGroupUniversalIdentifiers: [], + rowLevelPermissionPredicateGroupUniversalIdentifiers: [], + }; + + const flatObjectMetadataMaps = + createEmptyUniversalFlatEntityMaps(); + + addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow({ + universalFlatEntity: mockUniversalObjectMetadata, + universalFlatEntityMapsToMutate: flatObjectMetadataMaps, + }); + + const flatFieldMetadataMaps = + createEmptyUniversalFlatEntityMaps(); + + addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow({ + universalFlatEntity: mockUniversalFieldMetadata, + universalFlatEntityMapsToMutate: flatFieldMetadataMaps, + }); + + const flatViewMaps = + createEmptyUniversalFlatEntityMaps(); + + addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow({ + universalFlatEntity: mockUniversalView, + universalFlatEntityMapsToMutate: flatViewMaps, + }); + + const universalFlatEntityAndRelatedMapsToMutate = { + flatFieldMetadataMaps, + flatObjectMetadataMaps, + flatViewMaps, + } as unknown as MetadataUniversalFlatEntityAndRelatedFlatEntityMapsForValidation<'view'>; + + expect( + findFlatEntityByUniversalIdentifier({ + universalIdentifier: viewUniversalIdentifier, + flatEntityMaps: + universalFlatEntityAndRelatedMapsToMutate.flatViewMaps as UniversalFlatEntityMaps, + }), + ).toBeDefined(); + + deleteUniversalFlatEntityFromUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow( + { + metadataName: 'view', + universalFlatEntity: + mockUniversalView as unknown as MetadataUniversalFlatEntity<'view'>, + universalFlatEntityAndRelatedMapsToMutate, + }, + ); + + expect( + findFlatEntityByUniversalIdentifier({ + universalIdentifier: viewUniversalIdentifier, + flatEntityMaps: + universalFlatEntityAndRelatedMapsToMutate.flatViewMaps as UniversalFlatEntityMaps, + }), + ).toBeUndefined(); + + const updatedObjectMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: objectMetadataUniversalIdentifier, + flatEntityMaps: + universalFlatEntityAndRelatedMapsToMutate.flatObjectMetadataMaps as UniversalFlatEntityMaps, + }); + + expect(updatedObjectMetadata).toMatchObject({ + viewUniversalIdentifiers: [], + }); + + const updatedFieldMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: fieldMetadataUniversalIdentifier, + flatEntityMaps: + universalFlatEntityAndRelatedMapsToMutate.flatFieldMetadataMaps as UniversalFlatEntityMaps, + }); + + expect(updatedFieldMetadata).toMatchObject({ + calendarViewUniversalIdentifiers: [], + }); + }); +}); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/__tests__/sanitize-flat-entity-update.util.spec.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/sanitize-universal-flat-entity-update.util.spec.ts similarity index 81% rename from packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/__tests__/sanitize-flat-entity-update.util.spec.ts rename to packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/sanitize-universal-flat-entity-update.util.spec.ts index 5c75ac7ea9..3f61355915 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/__tests__/sanitize-flat-entity-update.util.spec.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/sanitize-universal-flat-entity-update.util.spec.ts @@ -1,10 +1,10 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; -import { sanitizeFlatEntityUpdate } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/sanitize-flat-entity-update.util'; +import { sanitizeUniversalFlatEntityUpdate } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/sanitize-universal-flat-entity-update.util'; describe('sanitizeFlatEntityUpdate', () => { it('should return only valid properties for fieldMetadata when update contains valid and invalid properties', () => { - const result = sanitizeFlatEntityUpdate({ + const result = sanitizeUniversalFlatEntityUpdate({ flatEntityUpdate: { isActive: true, label: 'New Label', @@ -17,7 +17,7 @@ describe('sanitizeFlatEntityUpdate', () => { }); it('should return empty object when all properties are undefined for fieldMetadata', () => { - const result = sanitizeFlatEntityUpdate({ + const result = sanitizeUniversalFlatEntityUpdate({ flatEntityUpdate: { isActive: undefined, label: undefined, @@ -29,7 +29,7 @@ describe('sanitizeFlatEntityUpdate', () => { }); it('should return empty object when update is empty for fieldMetadata', () => { - const result = sanitizeFlatEntityUpdate({ + const result = sanitizeUniversalFlatEntityUpdate({ flatEntityUpdate: {} as any, metadataName: 'fieldMetadata' as AllMetadataName, }); @@ -38,7 +38,7 @@ describe('sanitizeFlatEntityUpdate', () => { }); it('should preserve null values as they are valid updates for fieldMetadata', () => { - const result = sanitizeFlatEntityUpdate({ + const result = sanitizeUniversalFlatEntityUpdate({ flatEntityUpdate: { isActive: false, label: null, @@ -51,7 +51,7 @@ describe('sanitizeFlatEntityUpdate', () => { }); it('should return only valid properties for view metadata', () => { - const result = sanitizeFlatEntityUpdate({ + const result = sanitizeUniversalFlatEntityUpdate({ flatEntityUpdate: { name: 'My View', icon: 'IconUser', @@ -64,7 +64,7 @@ describe('sanitizeFlatEntityUpdate', () => { }); it('should return only valid properties for objectMetadata', () => { - const result = sanitizeFlatEntityUpdate({ + const result = sanitizeUniversalFlatEntityUpdate({ flatEntityUpdate: { isActive: true, labelSingular: 'Person', @@ -78,7 +78,7 @@ describe('sanitizeFlatEntityUpdate', () => { }); it('should handle viewField metadata updates', () => { - const result = sanitizeFlatEntityUpdate({ + const result = sanitizeUniversalFlatEntityUpdate({ flatEntityUpdate: { position: 1, size: 100, @@ -92,7 +92,7 @@ describe('sanitizeFlatEntityUpdate', () => { }); it('should handle role metadata updates', () => { - const result = sanitizeFlatEntityUpdate({ + const result = sanitizeUniversalFlatEntityUpdate({ flatEntityUpdate: { label: 'Admin Role', description: 'Administrator role', @@ -105,7 +105,7 @@ describe('sanitizeFlatEntityUpdate', () => { }); it('should handle agent metadata updates', () => { - const result = sanitizeFlatEntityUpdate({ + const result = sanitizeUniversalFlatEntityUpdate({ flatEntityUpdate: { name: 'My Agent', description: 'Agent description', @@ -118,7 +118,7 @@ describe('sanitizeFlatEntityUpdate', () => { }); it('should handle webhook metadata updates', () => { - const result = sanitizeFlatEntityUpdate({ + const result = sanitizeUniversalFlatEntityUpdate({ flatEntityUpdate: { targetUrl: 'https://example.com/webhook', description: 'My webhook', diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/universal-flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts similarity index 98% rename from packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts rename to packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/universal-flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts index 069a14e3ea..aa036e4ef9 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/universal-flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts @@ -6,7 +6,7 @@ import { FieldMetadataType, type FromTo } from 'twenty-shared/types'; import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; -import { flatEntityDeletedCreatedUpdatedMatrixDispatcher } from 'src/engine/workspace-manager/workspace-migration/utils/flat-entity-deleted-created-updated-matrix-dispatcher.util'; +import { flatEntityDeletedCreatedUpdatedMatrixDispatcher } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/universal-flat-entity-deleted-created-updated-matrix-dispatcher.util'; import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-builder-options.type'; type TestContext = FromTo[]> & { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts new file mode 100644 index 0000000000..711ed248d3 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts @@ -0,0 +1,116 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; +import { isDefined } from 'twenty-shared/utils'; + +import { + FlatEntityMapsException, + FlatEntityMapsExceptionCode, +} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; +import { type MetadataUniversalFlatEntityAndRelatedUniversalFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; +import { type MetadataRelatedFlatEntityMapsKeys } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-flat-entity-maps-keys.type'; +import { type MetadataUniversalFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-universal-flat-entity.type'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; +import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; +import { ALL_UNIVERSAL_METADATA_RELATIONS } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/all-universal-metadata-relations.constant'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; +import { addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-maps-through-mutation-or-throw.util'; +import { replaceUniversalFlatEntityInUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/replace-universal-flat-entity-in-universal-flat-entity-maps-through-mutation-or-throw.util'; + +type AddUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrowArgs< + T extends AllMetadataName, +> = { + metadataName: T; + universalFlatEntity: MetadataUniversalFlatEntity; + universalFlatEntityAndRelatedMapsToMutate: MetadataUniversalFlatEntityAndRelatedUniversalFlatEntityMaps; +}; + +export const addUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow = + ({ + metadataName, + universalFlatEntity, + universalFlatEntityAndRelatedMapsToMutate, + }: AddUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrowArgs) => { + const flatEntityMapsKey = getMetadataFlatEntityMapsKey(metadataName); + + addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow({ + universalFlatEntity, + universalFlatEntityMapsToMutate: + universalFlatEntityAndRelatedMapsToMutate[flatEntityMapsKey], + }); + + const universalManyToOneRelations = Object.values( + ALL_UNIVERSAL_METADATA_RELATIONS[metadataName].manyToOne, + ) as Array<{ + metadataName: AllMetadataName; + universalFlatEntityForeignKeyAggregator: string | null; + universalForeignKey: string; + } | null>; + + for (const universalRelation of universalManyToOneRelations) { + if (!isDefined(universalRelation)) { + continue; + } + + const { + metadataName: relatedMetadataName, + universalFlatEntityForeignKeyAggregator, + universalForeignKey, + } = universalRelation; + + if (!isDefined(universalFlatEntityForeignKeyAggregator)) { + continue; + } + + const relatedFlatEntityMapsKey = + getMetadataFlatEntityMapsKey(relatedMetadataName); + + const relatedUniversalFlatEntityMaps = + universalFlatEntityAndRelatedMapsToMutate[ + relatedFlatEntityMapsKey as MetadataRelatedFlatEntityMapsKeys + ] as UniversalFlatEntityMaps< + MetadataUniversalFlatEntity + >; + + const universalForeignKeyValue = ( + universalFlatEntity as unknown as Record + )[universalForeignKey]; + + if (!isDefined(universalForeignKeyValue)) { + continue; + } + + const relatedUniversalFlatEntity = + findFlatEntityByUniversalIdentifierOrThrow({ + universalIdentifier: universalForeignKeyValue, + flatEntityMaps: relatedUniversalFlatEntityMaps, + }); + + if ( + !Object.prototype.hasOwnProperty.call( + relatedUniversalFlatEntity, + universalFlatEntityForeignKeyAggregator, + ) + ) { + throw new FlatEntityMapsException( + `Should never occur, invalid flat entity typing. flat ${relatedMetadataName} should contain ${universalFlatEntityForeignKeyAggregator}`, + FlatEntityMapsExceptionCode.ENTITY_MALFORMED, + ); + } + + const updatedRelatedEntity = { + ...relatedUniversalFlatEntity, + [universalFlatEntityForeignKeyAggregator]: [ + ...(( + relatedUniversalFlatEntity as unknown as Record + )[universalFlatEntityForeignKeyAggregator] ?? []), + universalFlatEntity.universalIdentifier, + ], + }; + + replaceUniversalFlatEntityInUniversalFlatEntityMapsThroughMutationOrThrow( + { + universalFlatEntity: updatedRelatedEntity, + universalFlatEntityMapsToMutate: relatedUniversalFlatEntityMaps, + }, + ); + } + }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-maps-or-throw.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-maps-or-throw.util.ts new file mode 100644 index 0000000000..9a8add26fe --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-maps-or-throw.util.ts @@ -0,0 +1,43 @@ +import { isDefined } from 'twenty-shared/utils'; + +import { + FlatEntityMapsException, + FlatEntityMapsExceptionCode, +} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type'; +import { type UniversalSyncableFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; + +type AddUniversalFlatEntityToUniversalFlatEntityMapsOrThrowArgs< + T extends SyncableFlatEntity | UniversalSyncableFlatEntity, +> = { + universalFlatEntity: T; + universalFlatEntityMaps: UniversalFlatEntityMaps; +}; + +export const addUniversalFlatEntityToUniversalFlatEntityMapsOrThrow = < + T extends SyncableFlatEntity | UniversalSyncableFlatEntity, +>({ + universalFlatEntity, + universalFlatEntityMaps, +}: AddUniversalFlatEntityToUniversalFlatEntityMapsOrThrowArgs): UniversalFlatEntityMaps => { + if ( + isDefined( + universalFlatEntityMaps.byUniversalIdentifier[ + universalFlatEntity.universalIdentifier + ], + ) + ) { + throw new FlatEntityMapsException( + 'addUniversalFlatEntityToUniversalFlatEntityMapsOrThrow: flat entity to add already exists', + FlatEntityMapsExceptionCode.ENTITY_ALREADY_EXISTS, + ); + } + + return { + byUniversalIdentifier: { + ...universalFlatEntityMaps.byUniversalIdentifier, + [universalFlatEntity.universalIdentifier]: universalFlatEntity, + }, + }; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-maps-through-mutation-or-throw.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-maps-through-mutation-or-throw.util.ts new file mode 100644 index 0000000000..3496bbd114 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-maps-through-mutation-or-throw.util.ts @@ -0,0 +1,39 @@ +import { isDefined } from 'twenty-shared/utils'; + +import { + FlatEntityMapsException, + FlatEntityMapsExceptionCode, +} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type'; +import { type UniversalSyncableFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; + +type AddUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrowArgs< + T extends SyncableFlatEntity | UniversalSyncableFlatEntity, +> = { + universalFlatEntity: T; + universalFlatEntityMapsToMutate: UniversalFlatEntityMaps; +}; + +export const addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow = + ({ + universalFlatEntity, + universalFlatEntityMapsToMutate, + }: AddUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrowArgs): void => { + if ( + isDefined( + universalFlatEntityMapsToMutate.byUniversalIdentifier[ + universalFlatEntity.universalIdentifier + ], + ) + ) { + throw new FlatEntityMapsException( + 'addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow: flat entity to add already exists', + FlatEntityMapsExceptionCode.ENTITY_ALREADY_EXISTS, + ); + } + + universalFlatEntityMapsToMutate.byUniversalIdentifier[ + universalFlatEntity.universalIdentifier + ] = universalFlatEntity; + }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/compare-two-universal-flat-entity.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/compare-two-universal-flat-entity.util.ts new file mode 100644 index 0000000000..558e0e01d3 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/compare-two-universal-flat-entity.util.ts @@ -0,0 +1,77 @@ +import diff from 'microdiff'; +import { type AllMetadataName } from 'twenty-shared/metadata'; +import { type FromTo } from 'twenty-shared/types'; +import { parseJson } from 'twenty-shared/utils'; + +import { ALL_UNIVERSAL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY } from 'src/engine/metadata-modules/flat-entity/constant/all-universal-flat-entity-properties-to-compare-and-stringify.constant'; +import { type MetadataUniversalFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-universal-flat-entity.type'; +import { type MetadataUniversalFlatEntityPropertiesToStringify } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-properties-to-stringify.type'; +import { type UniversalFlatEntityUpdate } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-update.type'; +import { transformUniversalFlatEntityForComparison } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/transform-universal-flat-entity-for-comparison.util'; + +type CompareTwoUniversalFlatEntityArgs = FromTo< + MetadataUniversalFlatEntity, + 'universalFlatEntity' +> & { metadataName: T }; + +export const compareTwoFlatEntity = ({ + fromUniversalFlatEntity, + toUniversalFlatEntity, + metadataName, +}: CompareTwoUniversalFlatEntityArgs): + | UniversalFlatEntityUpdate + | undefined => { + const { propertiesToStringify, propertiesToCompare } = + ALL_UNIVERSAL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY[metadataName]; + + const [transformedFromUniversalFlatEntity, transformedToUniversalFlatEntity] = + [fromUniversalFlatEntity, toUniversalFlatEntity].map( + (universalFlatEntity) => + transformUniversalFlatEntityForComparison({ + universalFlatEntity, + propertiesToCompare, + propertiesToStringify, + }), + ); + + const flatEntityDifferences = diff( + transformedFromUniversalFlatEntity, + transformedToUniversalFlatEntity, + ); + + if (flatEntityDifferences.length === 0) { + return undefined; + } + + const initialAccumulator: UniversalFlatEntityUpdate = {}; + + return flatEntityDifferences.reduce((accumulator, difference) => { + switch (difference.type) { + case 'CHANGE': { + const { path, value } = difference; + const property = path[0]; + const isJsonb = propertiesToStringify.includes( + property as MetadataUniversalFlatEntityPropertiesToStringify, + ); + + if (isJsonb) { + return { + ...accumulator, + [property]: parseJson(value), + }; + } + + return { + ...accumulator, + [property]: value, + }; + } + case 'CREATE': + case 'REMOVE': + default: { + // Should never occur, we should only provide null never undefined and so on + return accumulator; + } + } + }, initialAccumulator); +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/delete-universal-flat-entity-from-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/delete-universal-flat-entity-from-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts new file mode 100644 index 0000000000..bce96cc57b --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/delete-universal-flat-entity-from-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts @@ -0,0 +1,125 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; +import { isDefined } from 'twenty-shared/utils'; + +import { + FlatEntityMapsException, + FlatEntityMapsExceptionCode, +} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; +import { type MetadataRelatedFlatEntityMapsKeys } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-flat-entity-maps-keys.type'; +import { type MetadataUniversalFlatEntityAndRelatedUniversalFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; +import { type MetadataUniversalFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-universal-flat-entity.type'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; +import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; +import { ALL_UNIVERSAL_METADATA_RELATIONS } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/all-universal-metadata-relations.constant'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; +import { deleteUniversalFlatEntityFromUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/delete-universal-flat-entity-from-universal-flat-entity-maps-through-mutation-or-throw.util'; +import { replaceUniversalFlatEntityInUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/replace-universal-flat-entity-in-universal-flat-entity-maps-through-mutation-or-throw.util'; + +type DeleteUniversalFlatEntityFromUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrowArgs< + T extends AllMetadataName, +> = { + metadataName: T; + universalFlatEntity: MetadataUniversalFlatEntity; + universalFlatEntityAndRelatedMapsToMutate: MetadataUniversalFlatEntityAndRelatedUniversalFlatEntityMaps; +}; + +export const deleteUniversalFlatEntityFromUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow = + ({ + metadataName, + universalFlatEntity, + universalFlatEntityAndRelatedMapsToMutate, + }: DeleteUniversalFlatEntityFromUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrowArgs) => { + const flatEntityMapsKey = getMetadataFlatEntityMapsKey(metadataName); + + deleteUniversalFlatEntityFromUniversalFlatEntityMapsThroughMutationOrThrow({ + universalIdentifierToDelete: universalFlatEntity.universalIdentifier, + universalFlatEntityMapsToMutate: + universalFlatEntityAndRelatedMapsToMutate[ + flatEntityMapsKey + ] as UniversalFlatEntityMaps< + MetadataUniversalFlatEntity + >, + }); + + const universalManyToOneRelations = Object.values( + ALL_UNIVERSAL_METADATA_RELATIONS[metadataName].manyToOne, + ) as Array<{ + metadataName: AllMetadataName; + universalFlatEntityForeignKeyAggregator: string | null; + universalForeignKey: string; + } | null>; + + for (const universalRelation of universalManyToOneRelations) { + if (!isDefined(universalRelation)) { + continue; + } + + const { + metadataName: relatedMetadataName, + universalFlatEntityForeignKeyAggregator, + universalForeignKey, + } = universalRelation; + + if (!isDefined(universalFlatEntityForeignKeyAggregator)) { + continue; + } + + const relatedFlatEntityMapsKey = + getMetadataFlatEntityMapsKey(relatedMetadataName); + + const relatedUniversalFlatEntityMaps = + universalFlatEntityAndRelatedMapsToMutate[ + relatedFlatEntityMapsKey as MetadataRelatedFlatEntityMapsKeys + ] as UniversalFlatEntityMaps< + MetadataUniversalFlatEntity + >; + + const universalForeignKeyValue = ( + universalFlatEntity as unknown as Record + )[universalForeignKey]; + + if (!isDefined(universalForeignKeyValue)) { + continue; + } + + const relatedUniversalFlatEntity = findFlatEntityByUniversalIdentifier({ + universalIdentifier: universalForeignKeyValue, + flatEntityMaps: relatedUniversalFlatEntityMaps, + }); + + if (!isDefined(relatedUniversalFlatEntity)) { + continue; + } + + if ( + !Object.prototype.hasOwnProperty.call( + relatedUniversalFlatEntity, + universalFlatEntityForeignKeyAggregator, + ) + ) { + throw new FlatEntityMapsException( + `Should never occur, invalid flat entity typing. flat ${relatedMetadataName} should contain ${universalFlatEntityForeignKeyAggregator}`, + FlatEntityMapsExceptionCode.ENTITY_MALFORMED, + ); + } + + const updatedRelatedEntity = { + ...relatedUniversalFlatEntity, + [universalFlatEntityForeignKeyAggregator]: ( + (relatedUniversalFlatEntity as unknown as Record)[ + universalFlatEntityForeignKeyAggregator + ] ?? [] + ).filter( + (universalIdentifier) => + universalIdentifier !== universalFlatEntity.universalIdentifier, + ), + }; + + replaceUniversalFlatEntityInUniversalFlatEntityMapsThroughMutationOrThrow( + { + universalFlatEntity: updatedRelatedEntity, + universalFlatEntityMapsToMutate: relatedUniversalFlatEntityMaps, + }, + ); + } + }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/delete-universal-flat-entity-from-universal-flat-entity-maps-through-mutation-or-throw.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/delete-universal-flat-entity-from-universal-flat-entity-maps-through-mutation-or-throw.util.ts new file mode 100644 index 0000000000..3d143f935f --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/delete-universal-flat-entity-from-universal-flat-entity-maps-through-mutation-or-throw.util.ts @@ -0,0 +1,38 @@ +import { isDefined } from 'twenty-shared/utils'; + +import { + FlatEntityMapsException, + FlatEntityMapsExceptionCode, +} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type'; +import { type UniversalSyncableFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; + +export type DeleteUniversalFlatEntityFromUniversalFlatEntityMapsThroughMutationOrThrowArgs< + T extends SyncableFlatEntity | UniversalSyncableFlatEntity, +> = { + universalIdentifierToDelete: string; + universalFlatEntityMapsToMutate: UniversalFlatEntityMaps; +}; + +export const deleteUniversalFlatEntityFromUniversalFlatEntityMapsThroughMutationOrThrow = + ({ + universalFlatEntityMapsToMutate, + universalIdentifierToDelete, + }: DeleteUniversalFlatEntityFromUniversalFlatEntityMapsThroughMutationOrThrowArgs): void => { + const entityToDelete = + universalFlatEntityMapsToMutate.byUniversalIdentifier[ + universalIdentifierToDelete + ]; + + if (!isDefined(entityToDelete)) { + throw new FlatEntityMapsException( + 'deleteUniversalFlatEntityFromUniversalFlatEntityMapsThroughMutationOrThrow: entity to delete not found', + FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND, + ); + } + + delete universalFlatEntityMapsToMutate.byUniversalIdentifier[ + universalIdentifierToDelete + ]; + }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/replace-universal-flat-entity-in-universal-flat-entity-maps-through-mutation-or-throw.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/replace-universal-flat-entity-in-universal-flat-entity-maps-through-mutation-or-throw.util.ts new file mode 100644 index 0000000000..48ec68a9db --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/replace-universal-flat-entity-in-universal-flat-entity-maps-through-mutation-or-throw.util.ts @@ -0,0 +1,28 @@ +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type'; +import { type UniversalSyncableFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; +import { addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-maps-through-mutation-or-throw.util'; +import { deleteUniversalFlatEntityFromUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/delete-universal-flat-entity-from-universal-flat-entity-maps-through-mutation-or-throw.util'; + +export type ReplaceUniversalFlatEntityInUniversalFlatEntityMapsThroughMutationOrThrowArgs< + T extends SyncableFlatEntity | UniversalSyncableFlatEntity, +> = { + universalFlatEntity: T; + universalFlatEntityMapsToMutate: UniversalFlatEntityMaps; +}; + +export const replaceUniversalFlatEntityInUniversalFlatEntityMapsThroughMutationOrThrow = + ({ + universalFlatEntity, + universalFlatEntityMapsToMutate, + }: ReplaceUniversalFlatEntityInUniversalFlatEntityMapsThroughMutationOrThrowArgs): void => { + deleteUniversalFlatEntityFromUniversalFlatEntityMapsThroughMutationOrThrow({ + universalFlatEntityMapsToMutate, + universalIdentifierToDelete: universalFlatEntity.universalIdentifier, + }); + + addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow({ + universalFlatEntity, + universalFlatEntityMapsToMutate, + }); + }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-relation-identifiers-to-ids.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-relation-identifiers-to-ids.util.ts new file mode 100644 index 0000000000..607b53a011 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-relation-identifiers-to-ids.util.ts @@ -0,0 +1,156 @@ +import { t } from '@lingui/core/macro'; +import { type AllMetadataName } from 'twenty-shared/metadata'; +import { isDefined } from 'twenty-shared/utils'; + +import { type MetadataManyToOneRelationConfiguration } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-relations.constant'; +import { + FlatEntityMapsException, + FlatEntityMapsExceptionCode, +} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; +import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; +import { type ExtractEntityManyToOneEntityRelationProperties } from 'src/engine/metadata-modules/flat-entity/types/extract-entity-many-to-one-entity-relation-properties.type'; +import { type MetadataEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-entity.type'; +import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; +import { type MetadataToFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/types/metadata-to-flat-entity-maps-key'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; +import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; +import { + ALL_UNIVERSAL_METADATA_RELATIONS, + type ToUniversalMetadataManyToOneRelationConfiguration, +} from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/all-universal-metadata-relations.constant'; + +type UniversalManyToOneConfig = + (typeof ALL_UNIVERSAL_METADATA_RELATIONS)[T]['manyToOne']; + +type ExtractUniversalForeignKeys = { + [K in keyof T]: T[K] extends { universalForeignKey: infer UFK } ? UFK : never; +}[keyof T]; + +type MetadataUniversalManyToOneJoinColumn = + ExtractUniversalForeignKeys>; + +type TargetMetadataNamesForUniversalForeignKeys< + T extends AllMetadataName, + TProvidedKeys extends string, +> = { + [K in keyof UniversalManyToOneConfig]: UniversalManyToOneConfig[K] extends { + universalForeignKey: infer _UFK extends TProvidedKeys; + metadataName: infer MN extends AllMetadataName; + } + ? MN + : never; +}[keyof UniversalManyToOneConfig]; + +type RequiredFlatEntityMapsForUniversalForeignKeys< + T extends AllMetadataName, + TProvidedKeys extends string, +> = Pick< + AllFlatEntityMaps, + MetadataToFlatEntityMapsKey< + TargetMetadataNamesForUniversalForeignKeys + > +>; + +type ResolvedForeignKeyIds< + T extends AllMetadataName, + TProvidedKeys extends Extract< + MetadataUniversalManyToOneJoinColumn, + string + >, +> = { + [K in keyof UniversalManyToOneConfig as UniversalManyToOneConfig[K] extends { + universalForeignKey: infer UFK extends string; + foreignKey: infer FK extends string; + } + ? UFK extends TProvidedKeys + ? FK + : never + : never]: UniversalManyToOneConfig[K] extends { isNullable: true } + ? string | null + : string; +}; + +export const resolveUniversalRelationIdentifiersToIds = < + T extends AllMetadataName, + TProvidedKeys extends Extract< + MetadataUniversalManyToOneJoinColumn, + string + > = Extract, string>, +>({ + metadataName, + universalForeignKeyValues, + flatEntityMaps, +}: { + metadataName: T; + universalForeignKeyValues: Record; + flatEntityMaps: RequiredFlatEntityMapsForUniversalForeignKeys< + T, + TProvidedKeys + >; +}): ResolvedForeignKeyIds => { + const relations = ALL_UNIVERSAL_METADATA_RELATIONS[metadataName].manyToOne; + const result: Record = {}; + + for (const relation of Object.values( + relations, + ) as ToUniversalMetadataManyToOneRelationConfiguration< + MetadataManyToOneRelationConfiguration< + T, + ExtractEntityManyToOneEntityRelationProperties> + > + >[]) { + if (!isDefined(relation)) { + continue; + } + + const { + foreignKey, + universalForeignKey, + metadataName: targetMetadataName, + isNullable, + } = relation; + + if ( + !Object.prototype.hasOwnProperty.call( + universalForeignKeyValues, + universalForeignKey, + ) + ) { + continue; + } + + const universalIdentifierValue = + universalForeignKeyValues[ + universalForeignKey as keyof typeof universalForeignKeyValues + ]; + + const mapsKey = getMetadataFlatEntityMapsKey( + targetMetadataName, + ) as keyof RequiredFlatEntityMapsForUniversalForeignKeys; + const targetFlatEntityMaps = flatEntityMaps[mapsKey]; + + if (isNullable && !isDefined(universalIdentifierValue)) { + result[foreignKey] = null; + + continue; + } + + const targetEntity = findFlatEntityByUniversalIdentifier< + MetadataFlatEntity + >({ + flatEntityMaps: targetFlatEntityMaps, + universalIdentifier: universalIdentifierValue as string, + }); + + if (!isDefined(targetEntity)) { + throw new FlatEntityMapsException( + t`Could not find ${targetMetadataName} for given ${universalForeignKey}`, + FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND, + ); + } + + result[foreignKey] = targetEntity.id; + } + + return result as ResolvedForeignKeyIds; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util.ts new file mode 100644 index 0000000000..084f061cc2 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util.ts @@ -0,0 +1,95 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; +import { isDefined } from 'twenty-shared/utils'; + +import { type MetadataManyToOneRelationConfiguration } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-relations.constant'; +import { + FlatEntityMapsException, + FlatEntityMapsExceptionCode, +} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; +import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; +import { type ExtractEntityManyToOneEntityRelationProperties } from 'src/engine/metadata-modules/flat-entity/types/extract-entity-many-to-one-entity-relation-properties.type'; +import { type FlatEntityUpdate } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-update.type'; +import { type MetadataEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-entity.type'; +import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; +import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; +import { + ALL_UNIVERSAL_METADATA_RELATIONS, + type ToUniversalMetadataManyToOneRelationConfiguration, +} from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/all-universal-metadata-relations.constant'; +import { type UniversalFlatEntityUpdate } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-update.type'; + +export const resolveUniversalUpdateRelationIdentifiersToIds = < + T extends AllMetadataName, +>({ + metadataName, + universalUpdate, + allFlatEntityMaps, +}: { + metadataName: T; + universalUpdate: UniversalFlatEntityUpdate; + allFlatEntityMaps: AllFlatEntityMaps; +}): FlatEntityUpdate => { + const relations = ALL_UNIVERSAL_METADATA_RELATIONS[metadataName].manyToOne; + const result: Record = { ...universalUpdate }; + + for (const relation of Object.values( + relations, + ) as ToUniversalMetadataManyToOneRelationConfiguration< + MetadataManyToOneRelationConfiguration< + T, + ExtractEntityManyToOneEntityRelationProperties> + > + >[]) { + if (!isDefined(relation)) { + continue; + } + + const { + foreignKey, + universalForeignKey, + metadataName: targetMetadataName, + } = relation; + + if (!Object.prototype.hasOwnProperty.call(result, universalForeignKey)) { + continue; + } + + const universalIdentifierValue = result[universalForeignKey] as + | string + | null + | undefined; + + delete result[universalForeignKey]; + + if (!isDefined(universalIdentifierValue)) { + if (universalIdentifierValue === null) { + result[foreignKey] = null; + } + + continue; + } + + const mapsKey = getMetadataFlatEntityMapsKey(targetMetadataName); + + const targetFlatEntityMaps = allFlatEntityMaps[mapsKey]; + + const targetEntity = findFlatEntityByUniversalIdentifier< + MetadataFlatEntity + >({ + flatEntityMaps: targetFlatEntityMaps, + universalIdentifier: universalIdentifierValue, + }); + + if (!isDefined(targetEntity)) { + throw new FlatEntityMapsException( + `Could not resolve ${universalForeignKey} to ${foreignKey}: no ${targetMetadataName} found for universal identifier ${universalIdentifierValue}`, + FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND, + ); + } + + result[foreignKey] = targetEntity.id; + } + + return result as FlatEntityUpdate; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/sanitize-universal-flat-entity-update.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/sanitize-universal-flat-entity-update.util.ts new file mode 100644 index 0000000000..83d2225abf --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/sanitize-universal-flat-entity-update.util.ts @@ -0,0 +1,30 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { ALL_UNIVERSAL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY } from 'src/engine/metadata-modules/flat-entity/constant/all-universal-flat-entity-properties-to-compare-and-stringify.constant'; +import { type UniversalFlatEntityUpdate } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-update.type'; + +export const sanitizeUniversalFlatEntityUpdate = ({ + flatEntityUpdate, + metadataName, +}: { + flatEntityUpdate: UniversalFlatEntityUpdate; + metadataName: T; +}): UniversalFlatEntityUpdate => { + const { propertiesToCompare } = + ALL_UNIVERSAL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY[metadataName]; + + const initialAccumulator: UniversalFlatEntityUpdate = {}; + + return propertiesToCompare.reduce((accumulator, property) => { + const updatedValue = flatEntityUpdate[property]; + + if (updatedValue === undefined) { + return accumulator; + } + + return { + ...accumulator, + [property]: updatedValue, + }; + }, initialAccumulator); +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/transform-universal-flat-entity-for-comparison.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/transform-universal-flat-entity-for-comparison.util.ts new file mode 100644 index 0000000000..b91ad9e75b --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/transform-universal-flat-entity-for-comparison.util.ts @@ -0,0 +1,43 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type MetadataUniversalFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-universal-flat-entity.type'; +import { orderObjectProperties } from 'src/engine/metadata-modules/flat-entity/utils/order-object-properties.util'; +import { type MetadataUniversalFlatEntityPropertiesToCompare } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-properties-to-compare.type'; +import { type MetadataUniversalFlatEntityPropertiesToStringify } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-properties-to-stringify.type'; + +export function transformUniversalFlatEntityForComparison< + T extends AllMetadataName, +>({ + universalFlatEntity, + propertiesToCompare, + propertiesToStringify, +}: { + universalFlatEntity: MetadataUniversalFlatEntity; + propertiesToCompare: MetadataUniversalFlatEntityPropertiesToCompare[]; + propertiesToStringify: MetadataUniversalFlatEntityPropertiesToStringify[]; +}) { + return propertiesToCompare.reduce( + (flatEntityAccumulator, propertyToCompare) => { + const currentValue = universalFlatEntity[propertyToCompare]; + + if ( + propertiesToStringify.includes( + propertyToCompare as MetadataUniversalFlatEntityPropertiesToStringify, + ) + ) { + const orderedValue = orderObjectProperties(currentValue); + + return { + ...flatEntityAccumulator, + [propertyToCompare]: JSON.stringify(orderedValue), + }; + } + + return { + ...flatEntityAccumulator, + [propertyToCompare]: currentValue, + }; + }, + {}, + ); +} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/universal-flat-entity-deleted-created-updated-matrix-dispatcher.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/universal-flat-entity-deleted-created-updated-matrix-dispatcher.util.ts new file mode 100644 index 0000000000..29639079df --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/universal-flat-entity-deleted-created-updated-matrix-dispatcher.util.ts @@ -0,0 +1,102 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; +import { type FromTo } from 'twenty-shared/types'; +import { isDefined } from 'twenty-shared/utils'; + +import { type MetadataUniversalFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-universal-flat-entity.type'; +import { type MetadataUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-maps.type'; +import { type UniversalFlatEntityUpdate } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-update.type'; +import { compareTwoFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/compare-two-universal-flat-entity.util'; +import { addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/add-universal-flat-entity-to-universal-flat-entity-maps-through-mutation-or-throw.util'; +import { shouldInferDeletionFromMissingEntities } from 'src/engine/workspace-manager/workspace-migration/utils/should-infer-deletion-from-missing-entities.util'; +import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-builder-options.type'; + +export type DeletedCreatedUpdatedMatrix = { + createdFlatEntityMaps: MetadataUniversalFlatEntityMaps; + deletedFlatEntityMaps: MetadataUniversalFlatEntityMaps; + updatedFlatEntityMaps: { + byUniversalIdentifier: Record< + string, + { + update: UniversalFlatEntityUpdate; + } + >; + }; +}; + +export type UniversalIdentifierItem = { + universalIdentifier: string; +}; + +type FlatEntityDeletedCreatedUpdatedMatrixDispatcherArgs< + T extends AllMetadataName, +> = FromTo[]> & { + metadataName: T; + buildOptions: WorkspaceMigrationBuilderOptions; +}; + +export const flatEntityDeletedCreatedUpdatedMatrixDispatcher = < + T extends AllMetadataName, +>({ + from, + to, + metadataName, + buildOptions, +}: FlatEntityDeletedCreatedUpdatedMatrixDispatcherArgs): DeletedCreatedUpdatedMatrix => { + const initialDispatcher: DeletedCreatedUpdatedMatrix = { + createdFlatEntityMaps: { byUniversalIdentifier: {} }, + deletedFlatEntityMaps: { byUniversalIdentifier: {} }, + updatedFlatEntityMaps: { byUniversalIdentifier: {} }, + }; + + const fromMap = new Map(from.map((obj) => [obj.universalIdentifier, obj])); + const toMap = new Map(to.map((obj) => [obj.universalIdentifier, obj])); + + if (shouldInferDeletionFromMissingEntities({ buildOptions, metadataName })) { + for (const [universalIdentifier, fromEntity] of fromMap) { + if (toMap.has(universalIdentifier)) { + continue; + } + + addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow({ + universalFlatEntity: fromEntity, + universalFlatEntityMapsToMutate: + initialDispatcher.deletedFlatEntityMaps, + }); + } + } + + for (const [universalIdentifier, toFlatEntity] of toMap) { + if (fromMap.has(universalIdentifier)) { + continue; + } + addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow({ + universalFlatEntity: toFlatEntity, + universalFlatEntityMapsToMutate: initialDispatcher.createdFlatEntityMaps, + }); + } + + for (const [universalIdentifier, fromUniversalFlatEntity] of fromMap) { + const toUniversalFlatEntity = toMap.get(universalIdentifier); + + if (!isDefined(toUniversalFlatEntity)) { + continue; + } + const update = compareTwoFlatEntity({ + fromUniversalFlatEntity, + toUniversalFlatEntity, + metadataName, + }); + + if (!isDefined(update)) { + continue; + } + + initialDispatcher.updatedFlatEntityMaps.byUniversalIdentifier[ + fromUniversalFlatEntity.universalIdentifier + ] = { + update, + }; + } + + return initialDispatcher; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/validate-flat-entity-circular-dependency.util.spec.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/validate-flat-entity-circular-dependency.util.spec.ts index bc74341a21..9ba81dce04 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/validate-flat-entity-circular-dependency.util.spec.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/validate-flat-entity-circular-dependency.util.spec.ts @@ -1,42 +1,36 @@ import { type EachTestingContext } from 'twenty-shared/testing'; -import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type'; -import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; +import { type UniversalSyncableFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; import { type CircularDependencyValidationResult, validateFlatEntityCircularDependency, } from 'src/engine/workspace-manager/workspace-migration/utils/validate-flat-entity-circular-dependency.util'; -type TestFlatEntity = SyncableFlatEntity & { - parentId: string | null; +type TestFlatEntity = UniversalSyncableFlatEntity & { + parentUniversalIdentifier: string | null; }; -const createFlatEntityMaps = ( +const createUniversalFlatEntityMaps = ( entities: TestFlatEntity[], -): FlatEntityMaps => ({ +): UniversalFlatEntityMaps => ({ byUniversalIdentifier: Object.fromEntries( entities.map((entity) => [entity.universalIdentifier, entity]), ), - universalIdentifierById: Object.fromEntries( - entities.map((entity) => [entity.id, entity.universalIdentifier]), - ), - universalIdentifiersByApplicationId: {}, }); const createTestEntity = ( - id: string, - parentId: string | null = null, + universalIdentifier: string, + parentUniversalIdentifier: string | null = null, ): TestFlatEntity => ({ - id, - parentId, - universalIdentifier: id, - applicationId: 'test-app', - workspaceId: 'test-workspace', + parentUniversalIdentifier, + universalIdentifier, + applicationUniversalIdentifier: 'test-app', }); type TestContext = { - flatEntityId: string; - flatEntityParentId: string; + flatEntityUniversalIdentifier: string; + flatEntityParentUniversalIdentifier: string; maxDepth?: number; entities: TestFlatEntity[]; expected: CircularDependencyValidationResult; @@ -48,8 +42,8 @@ const testCases: ValidateCircularDependencyTestCase[] = [ { title: 'should fail with self_reference when entity is its own parent', context: { - flatEntityId: 'entity-1', - flatEntityParentId: 'entity-1', + flatEntityUniversalIdentifier: 'entity-1', + flatEntityParentUniversalIdentifier: 'entity-1', entities: [], expected: { status: 'fail', @@ -60,8 +54,8 @@ const testCases: ValidateCircularDependencyTestCase[] = [ { title: 'should succeed with depth 2 when parent has no parent', context: { - flatEntityId: 'entity-child', - flatEntityParentId: 'entity-parent', + flatEntityUniversalIdentifier: 'entity-child', + flatEntityParentUniversalIdentifier: 'entity-parent', entities: [createTestEntity('entity-parent', null)], expected: { status: 'success', @@ -72,8 +66,8 @@ const testCases: ValidateCircularDependencyTestCase[] = [ { title: 'should succeed with depth 3 when parent has a grandparent', context: { - flatEntityId: 'entity-child', - flatEntityParentId: 'entity-parent', + flatEntityUniversalIdentifier: 'entity-child', + flatEntityParentUniversalIdentifier: 'entity-parent', entities: [ createTestEntity('entity-grandparent', null), createTestEntity('entity-parent', 'entity-grandparent'), @@ -88,8 +82,8 @@ const testCases: ValidateCircularDependencyTestCase[] = [ title: 'should fail with circular_dependency when parent points back to entity', context: { - flatEntityId: 'entity-a', - flatEntityParentId: 'entity-b', + flatEntityUniversalIdentifier: 'entity-a', + flatEntityParentUniversalIdentifier: 'entity-b', entities: [createTestEntity('entity-b', 'entity-a')], expected: { status: 'fail', @@ -102,8 +96,8 @@ const testCases: ValidateCircularDependencyTestCase[] = [ title: 'should fail with circular_dependency when chain creates a cycle (A -> B -> C -> A)', context: { - flatEntityId: 'entity-a', - flatEntityParentId: 'entity-b', + flatEntityUniversalIdentifier: 'entity-a', + flatEntityParentUniversalIdentifier: 'entity-b', entities: [ createTestEntity('entity-b', 'entity-c'), createTestEntity('entity-c', 'entity-a'), @@ -119,8 +113,8 @@ const testCases: ValidateCircularDependencyTestCase[] = [ title: 'should fail with circular_dependency when ancestors form a cycle among themselves', context: { - flatEntityId: 'entity-new', - flatEntityParentId: 'entity-a', + flatEntityUniversalIdentifier: 'entity-new', + flatEntityParentUniversalIdentifier: 'entity-a', entities: [ createTestEntity('entity-a', 'entity-b'), createTestEntity('entity-b', 'entity-a'), @@ -135,8 +129,8 @@ const testCases: ValidateCircularDependencyTestCase[] = [ { title: 'should succeed when parent does not exist in maps', context: { - flatEntityId: 'entity-child', - flatEntityParentId: 'non-existent-parent', + flatEntityUniversalIdentifier: 'entity-child', + flatEntityParentUniversalIdentifier: 'non-existent-parent', entities: [], expected: { status: 'success', @@ -147,8 +141,8 @@ const testCases: ValidateCircularDependencyTestCase[] = [ { title: 'should fail with max_depth_exceeded when depth exceeds maxDepth', context: { - flatEntityId: 'entity-child', - flatEntityParentId: 'entity-parent', + flatEntityUniversalIdentifier: 'entity-child', + flatEntityParentUniversalIdentifier: 'entity-parent', maxDepth: 2, entities: [ createTestEntity('entity-grandparent', null), @@ -164,8 +158,8 @@ const testCases: ValidateCircularDependencyTestCase[] = [ { title: 'should succeed when depth equals maxDepth', context: { - flatEntityId: 'entity-child', - flatEntityParentId: 'entity-parent', + flatEntityUniversalIdentifier: 'entity-child', + flatEntityParentUniversalIdentifier: 'entity-parent', maxDepth: 3, entities: [ createTestEntity('entity-grandparent', null), @@ -180,8 +174,8 @@ const testCases: ValidateCircularDependencyTestCase[] = [ { title: 'should succeed with depth 2 when maxDepth is 2 and parent is root', context: { - flatEntityId: 'entity-child', - flatEntityParentId: 'entity-parent', + flatEntityUniversalIdentifier: 'entity-child', + flatEntityParentUniversalIdentifier: 'entity-parent', maxDepth: 2, entities: [createTestEntity('entity-parent', null)], expected: { @@ -194,8 +188,8 @@ const testCases: ValidateCircularDependencyTestCase[] = [ title: 'should check max depth before circular dependency to prevent infinite loop', context: { - flatEntityId: 'entity-new', - flatEntityParentId: 'entity-a', + flatEntityUniversalIdentifier: 'entity-new', + flatEntityParentUniversalIdentifier: 'entity-a', maxDepth: 2, entities: [ createTestEntity('entity-a', 'entity-b'), @@ -213,8 +207,8 @@ const testCases: ValidateCircularDependencyTestCase[] = [ { title: 'should handle deep valid hierarchy without maxDepth', context: { - flatEntityId: 'entity-new', - flatEntityParentId: 'entity-1', + flatEntityUniversalIdentifier: 'entity-new', + flatEntityParentUniversalIdentifier: 'entity-1', entities: [ createTestEntity('entity-5', null), createTestEntity('entity-4', 'entity-5'), @@ -232,13 +226,14 @@ const testCases: ValidateCircularDependencyTestCase[] = [ describe('validateFlatEntityCircularDependency', () => { test.each(testCases)('$title', ({ context }) => { - const flatEntityMaps = createFlatEntityMaps(context.entities); + const flatEntityMaps = createUniversalFlatEntityMaps(context.entities); const result = validateFlatEntityCircularDependency({ - flatEntityId: context.flatEntityId, - flatEntityParentId: context.flatEntityParentId, + flatEntityUniversalIdentifier: context.flatEntityUniversalIdentifier, + flatEntityParentUniversalIdentifier: + context.flatEntityParentUniversalIdentifier, maxDepth: context.maxDepth, - parentIdKey: 'parentId', + parentUniversalIdentifierKey: 'parentUniversalIdentifier', flatEntityMaps, }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/add-universal-flat-entity-to-universal-flat-entity-maps-through-mutation-or-throw.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/add-universal-flat-entity-to-universal-flat-entity-maps-through-mutation-or-throw.util.ts new file mode 100644 index 0000000000..e940562e39 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/add-universal-flat-entity-to-universal-flat-entity-maps-through-mutation-or-throw.util.ts @@ -0,0 +1,39 @@ +import { isDefined } from 'twenty-shared/utils'; + +import { + FlatEntityMapsException, + FlatEntityMapsExceptionCode, +} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type'; +import { type UniversalSyncableFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; + +type AddUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrowArgs< + T extends SyncableFlatEntity | UniversalSyncableFlatEntity, +> = { + universalFlatEntity: T; + universalFlatEntityMapsToMutate: UniversalFlatEntityMaps; +}; + +export const addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow = + ({ + universalFlatEntity: flatEntity, + universalFlatEntityMapsToMutate, + }: AddUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrowArgs): void => { + if ( + isDefined( + universalFlatEntityMapsToMutate.byUniversalIdentifier[ + flatEntity.universalIdentifier + ], + ) + ) { + throw new FlatEntityMapsException( + 'addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow: flat entity to add already exists', + FlatEntityMapsExceptionCode.ENTITY_ALREADY_EXISTS, + ); + } + + universalFlatEntityMapsToMutate.byUniversalIdentifier[ + flatEntity.universalIdentifier + ] = flatEntity; + }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/compute-universal-flat-entity-maps-from-to.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/compute-universal-flat-entity-maps-from-to.util.ts new file mode 100644 index 0000000000..d758d52c4e --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/compute-universal-flat-entity-maps-from-to.util.ts @@ -0,0 +1,66 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type FlatEntityToCreateDeleteUpdate } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-to-create-delete-update.type'; +import { getSubUniversalFlatEntityByUniversalIdentifiersMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-universal-flat-entity-by-universal-identifiers-maps-or-throw.util'; +import { type MetadataUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-maps.type'; +import { addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-maps-through-mutation-or-throw.util'; +import { deleteUniversalFlatEntityFromUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/delete-universal-flat-entity-from-universal-flat-entity-maps-through-mutation-or-throw.util'; +import { replaceUniversalFlatEntityInUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/replace-universal-flat-entity-in-universal-flat-entity-maps-through-mutation-or-throw.util'; + +export type ComputeUniversalFlatEntityMapsFromToArgs< + T extends AllMetadataName, +> = { + flatEntityMaps: MetadataUniversalFlatEntityMaps; +} & FlatEntityToCreateDeleteUpdate; + +export const computeUniversalFlatEntityMapsFromTo = < + T extends AllMetadataName, +>({ + flatEntityMaps, + flatEntityToCreate, + flatEntityToDelete, + flatEntityToUpdate, +}: ComputeUniversalFlatEntityMapsFromToArgs): { + from: MetadataUniversalFlatEntityMaps; + to: MetadataUniversalFlatEntityMaps; +} => { + const fromFlatEntityMaps = + flatEntityToDelete.length > 0 + ? getSubUniversalFlatEntityByUniversalIdentifiersMapsOrThrow({ + universalIdentifiers: [ + ...flatEntityToDelete, + ...flatEntityToUpdate, + ].map(({ universalIdentifier }) => universalIdentifier), + universalFlatEntityMaps: flatEntityMaps, + }) + : flatEntityMaps; + + const toFlatEntityMaps: MetadataUniversalFlatEntityMaps = + structuredClone(fromFlatEntityMaps); + + for (const flatEntity of flatEntityToDelete) { + deleteUniversalFlatEntityFromUniversalFlatEntityMapsThroughMutationOrThrow({ + universalIdentifierToDelete: flatEntity.universalIdentifier, + universalFlatEntityMapsToMutate: toFlatEntityMaps, + }); + } + + for (const flatEntity of flatEntityToUpdate) { + replaceUniversalFlatEntityInUniversalFlatEntityMapsThroughMutationOrThrow({ + universalFlatEntity: flatEntity, + universalFlatEntityMapsToMutate: toFlatEntityMaps, + }); + } + + for (const flatEntity of flatEntityToCreate) { + addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow({ + universalFlatEntity: flatEntity, + universalFlatEntityMapsToMutate: toFlatEntityMaps, + }); + } + + return { + from: fromFlatEntityMaps, + to: toFlatEntityMaps, + }; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/flat-entity-deleted-created-updated-matrix-dispatcher.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/flat-entity-deleted-created-updated-matrix-dispatcher.util.ts deleted file mode 100644 index b4f0244129..0000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/flat-entity-deleted-created-updated-matrix-dispatcher.util.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { type AllMetadataName } from 'twenty-shared/metadata'; -import { type FromTo } from 'twenty-shared/types'; -import { isDefined } from 'twenty-shared/utils'; - -import { ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY } from 'src/engine/metadata-modules/flat-entity/constant/all-flat-entity-properties-to-compare-and-stringify.constant'; -import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant'; -import { type FlatEntityPropertiesToCompare } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-to-compare.type'; -import { type FlatEntityPropertiesToStringify } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-to-stringify.type'; -import { type FlatEntityUpdate } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type'; -import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; -import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; -import { compareTwoFlatEntity } from 'src/engine/metadata-modules/flat-entity/utils/compare-two-flat-entity.util'; -import { addFlatEntityToFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/add-flat-entity-to-flat-entity-maps-through-mutation-or-throw.util'; -import { shouldInferDeletionFromMissingEntities } from 'src/engine/workspace-manager/workspace-migration/utils/should-infer-deletion-from-missing-entities.util'; -import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-builder-options.type'; - -export type DeletedCreatedUpdatedMatrix = { - createdFlatEntityMaps: MetadataFlatEntityMaps; - deletedFlatEntityMaps: MetadataFlatEntityMaps; - updatedFlatEntityMaps: { - byUniversalIdentifier: Record< - string, - { - update: FlatEntityUpdate; - // TMP remove when maps is universal based - id: string; - } - >; - }; -}; - -export type UniversalIdentifierItem = { - universalIdentifier: string; -}; - -type FlatEntityDeletedCreatedUpdatedMatrixDispatcherArgs< - T extends AllMetadataName, -> = FromTo[]> & { - metadataName: T; - buildOptions: WorkspaceMigrationBuilderOptions; -}; - -export const flatEntityDeletedCreatedUpdatedMatrixDispatcher = < - T extends AllMetadataName, ->({ - from, - to, - metadataName, - buildOptions, -}: FlatEntityDeletedCreatedUpdatedMatrixDispatcherArgs): DeletedCreatedUpdatedMatrix => { - const initialDispatcher: DeletedCreatedUpdatedMatrix = { - createdFlatEntityMaps: createEmptyFlatEntityMaps(), - deletedFlatEntityMaps: createEmptyFlatEntityMaps(), - updatedFlatEntityMaps: { byUniversalIdentifier: {} }, - }; - - const fromMap = new Map(from.map((obj) => [obj.universalIdentifier, obj])); - const toMap = new Map(to.map((obj) => [obj.universalIdentifier, obj])); - - if (shouldInferDeletionFromMissingEntities({ buildOptions, metadataName })) { - for (const [universalIdentifier, fromEntity] of fromMap) { - if (toMap.has(universalIdentifier)) { - continue; - } - addFlatEntityToFlatEntityMapsThroughMutationOrThrow({ - flatEntity: fromEntity, - flatEntityMapsToMutate: initialDispatcher.deletedFlatEntityMaps, - }); - } - } - - for (const [universalIdentifier, toFlatEntity] of toMap) { - if (fromMap.has(universalIdentifier)) { - continue; - } - addFlatEntityToFlatEntityMapsThroughMutationOrThrow({ - flatEntity: toFlatEntity, - flatEntityMapsToMutate: initialDispatcher.createdFlatEntityMaps, - }); - } - - const { propertiesToCompare, propertiesToStringify } = - ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY[metadataName]; - - for (const [universalIdentifier, fromFlatEntity] of fromMap) { - const toFlatEntity = toMap.get(universalIdentifier); - - if (!isDefined(toFlatEntity)) { - continue; - } - const update = compareTwoFlatEntity({ - fromFlatEntity, - toFlatEntity, - propertiesToCompare: propertiesToCompare as unknown as Extract< - FlatEntityPropertiesToCompare, - keyof MetadataFlatEntity - >[], - propertiesToStringify: propertiesToStringify as unknown as Extract< - FlatEntityPropertiesToStringify, - keyof MetadataFlatEntity - >[], - }); - - if (!isDefined(update)) { - continue; - } - - initialDispatcher.updatedFlatEntityMaps.byUniversalIdentifier[ - fromFlatEntity.universalIdentifier - ] = { - id: toFlatEntity.id, - update, - }; - } - - return initialDispatcher; -}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/validate-flat-entity-circular-dependency.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/validate-flat-entity-circular-dependency.util.ts index 55168f7a0f..5ed5d04887 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/validate-flat-entity-circular-dependency.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/validate-flat-entity-circular-dependency.util.ts @@ -1,8 +1,9 @@ import { isDefined } from 'twenty-shared/utils'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type'; -import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; +import { type UniversalSyncableFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; +import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; export type CircularDependencyValidationSuccess = { status: 'success'; @@ -20,23 +21,23 @@ export type CircularDependencyValidationResult = | CircularDependencyValidationFailure; export const validateFlatEntityCircularDependency = < - T extends SyncableFlatEntity, + T extends SyncableFlatEntity | UniversalSyncableFlatEntity, K extends keyof T, >({ - flatEntityId, - flatEntityParentId, + flatEntityUniversalIdentifier, + flatEntityParentUniversalIdentifier, maxDepth, - parentIdKey, + parentUniversalIdentifierKey, flatEntityMaps, }: { - flatEntityId: string; - flatEntityParentId: string; + flatEntityUniversalIdentifier: string; + flatEntityParentUniversalIdentifier: string; maxDepth?: number; - parentIdKey: K; - flatEntityMaps: FlatEntityMaps; + parentUniversalIdentifierKey: K; + flatEntityMaps: UniversalFlatEntityMaps; }): CircularDependencyValidationResult => { // Direct self-reference check - if (flatEntityId === flatEntityParentId) { + if (flatEntityUniversalIdentifier === flatEntityParentUniversalIdentifier) { return { status: 'fail', reason: 'self_reference', @@ -45,10 +46,11 @@ export const validateFlatEntityCircularDependency = < // Traverse ancestor chain to detect cycles and measure depth const visited = new Set(); - let currentParentId: string | null | undefined = flatEntityParentId; + let currentParentUniversalIdentifier: string | null | undefined = + flatEntityParentUniversalIdentifier; let depth = 1; - while (isDefined(currentParentId)) { + while (isDefined(currentParentUniversalIdentifier)) { if (isDefined(maxDepth) && depth > maxDepth) { return { status: 'fail', @@ -58,7 +60,7 @@ export const validateFlatEntityCircularDependency = < } // Check for circular dependency - if (currentParentId === flatEntityId) { + if (currentParentUniversalIdentifier === flatEntityUniversalIdentifier) { return { status: 'fail', reason: 'circular_dependency', @@ -67,7 +69,7 @@ export const validateFlatEntityCircularDependency = < } // Check for cycle in ancestors (already visited node) - if (visited.has(currentParentId)) { + if (visited.has(currentParentUniversalIdentifier)) { return { status: 'fail', reason: 'circular_dependency', @@ -75,10 +77,10 @@ export const validateFlatEntityCircularDependency = < }; } - visited.add(currentParentId); + visited.add(currentParentUniversalIdentifier); - const parentEntity: T | undefined = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: currentParentId, + const parentEntity: T | undefined = findFlatEntityByUniversalIdentifier({ + universalIdentifier: currentParentUniversalIdentifier, flatEntityMaps, }); @@ -86,11 +88,13 @@ export const validateFlatEntityCircularDependency = < break; } - const nextParentId: T[K] = parentEntity[parentIdKey]; + const nextParentUniversalIdentifier: T[K] = + parentEntity[parentUniversalIdentifierKey]; - currentParentId = - isDefined(nextParentId) && typeof nextParentId === 'string' - ? nextParentId + currentParentUniversalIdentifier = + isDefined(nextParentUniversalIdentifier) && + typeof nextParentUniversalIdentifier === 'string' + ? nextParentUniversalIdentifier : undefined; depth++; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service.ts index e216ae2568..10fc296f17 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service.ts @@ -2,6 +2,7 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspac import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; export type FlatCreateAgentAction = BaseFlatCreateWorkspaceMigrationAction<'agent'>; @@ -9,6 +10,9 @@ export type FlatCreateAgentAction = export type FlatUpdateAgentAction = BaseFlatUpdateWorkspaceMigrationAction<'agent'>; +export type UniversalUpdateAgentAction = + BaseUniversalUpdateWorkspaceMigrationAction<'agent'>; + export type UniversalDeleteAgentAction = BaseUniversalDeleteWorkspaceMigrationAction<'agent'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/workspace-migration-agent-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/workspace-migration-agent-actions-builder.service.ts index 8b07b501ed..c881132db3 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/workspace-migration-agent-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/workspace-migration-agent-actions-builder.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { FlatUpdateAgentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service'; +import { UniversalUpdateAgentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatAgentValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-agent-validator.service'; @Injectable() @@ -20,8 +20,11 @@ export class WorkspaceMigrationAgentActionsBuilderService extends WorkspaceEntit } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType { + args: UniversalFlatEntityValidationArgs, + ): UniversalFlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.agent, + 'create' + > { const validationResult = this.flatAgentValidatorService.validateFlatAgentCreation(args); @@ -45,8 +48,11 @@ export class WorkspaceMigrationAgentActionsBuilderService extends WorkspaceEntit } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType { + args: UniversalFlatEntityValidationArgs, + ): UniversalFlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.agent, + 'delete' + > { const validationResult = this.flatAgentValidatorService.validateFlatAgentDeletion(args); @@ -71,7 +77,10 @@ export class WorkspaceMigrationAgentActionsBuilderService extends WorkspaceEntit protected validateFlatEntityUpdate( args: FlatEntityUpdateValidationArgs, - ): FlatEntityValidationReturnType { + ): UniversalFlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.agent, + 'update' + > { const validationResult = this.flatAgentValidatorService.validateFlatAgentUpdate(args); @@ -82,12 +91,12 @@ export class WorkspaceMigrationAgentActionsBuilderService extends WorkspaceEntit }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updateAgentAction: FlatUpdateAgentAction = { + const updateAgentAction: UniversalUpdateAgentAction = { type: 'update', metadataName: 'agent', - entityId: flatEntityId, + universalIdentifier, update: flatEntityUpdate, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type.ts index 8488a4fd71..e1baded2ec 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type.ts @@ -2,6 +2,7 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspac import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; export type FlatCreateCommandMenuItemAction = BaseFlatCreateWorkspaceMigrationAction<'commandMenuItem'>; @@ -9,6 +10,9 @@ export type FlatCreateCommandMenuItemAction = export type FlatUpdateCommandMenuItemAction = BaseFlatUpdateWorkspaceMigrationAction<'commandMenuItem'>; +export type UniversalUpdateCommandMenuItemAction = + BaseUniversalUpdateWorkspaceMigrationAction<'commandMenuItem'>; + export type UniversalDeleteCommandMenuItemAction = BaseUniversalDeleteWorkspaceMigrationAction<'commandMenuItem'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/workspace-migration-command-menu-item-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/workspace-migration-command-menu-item-actions-builder.service.ts index a7e730c228..648d48b8c1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/workspace-migration-command-menu-item-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/workspace-migration-command-menu-item-actions-builder.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { FlatUpdateCommandMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type'; +import { UniversalUpdateCommandMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatCommandMenuItemValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-command-menu-item-validator.service'; @Injectable() @@ -20,8 +20,10 @@ export class WorkspaceMigrationCommandMenuItemActionsBuilderService extends Work } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.commandMenuItem + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.commandMenuItem, 'create' > { @@ -50,8 +52,10 @@ export class WorkspaceMigrationCommandMenuItemActionsBuilderService extends Work } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.commandMenuItem + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.commandMenuItem, 'delete' > { @@ -83,7 +87,7 @@ export class WorkspaceMigrationCommandMenuItemActionsBuilderService extends Work args: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.commandMenuItem >, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.commandMenuItem, 'update' > { @@ -99,12 +103,12 @@ export class WorkspaceMigrationCommandMenuItemActionsBuilderService extends Work }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updateCommandMenuItemAction: FlatUpdateCommandMenuItemAction = { + const updateCommandMenuItemAction: UniversalUpdateCommandMenuItemAction = { type: 'update', metadataName: 'commandMenuItem', - entityId: flatEntityId, + universalIdentifier, update: flatEntityUpdate, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/workspace-migration-field-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/workspace-migration-field-actions-builder.service.ts index f4c698161e..f3a5b5a2af 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/workspace-migration-field-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/workspace-migration-field-actions-builder.service.ts @@ -4,9 +4,9 @@ import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { UniversalUpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatFieldMetadataValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-field-metadata-validator.service'; @Injectable() @@ -20,8 +20,10 @@ export class WorkspaceMigrationFieldActionsBuilderService extends WorkspaceEntit } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.fieldMetadata + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.fieldMetadata, 'create' > { @@ -37,27 +39,21 @@ export class WorkspaceMigrationFieldActionsBuilderService extends WorkspaceEntit const { flatEntityToValidate: flatFieldMetadataToValidate } = args; - const fieldIdByUniversalIdentifier = flatFieldMetadataToValidate.id - ? { - [flatFieldMetadataToValidate.universalIdentifier]: - flatFieldMetadataToValidate.id, - } - : undefined; - return { status: 'success', action: { type: 'create', metadataName: 'fieldMetadata', universalFlatFieldMetadatas: [flatFieldMetadataToValidate], - fieldIdByUniversalIdentifier, }, }; } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.fieldMetadata + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.fieldMetadata, 'delete' > { @@ -87,7 +83,7 @@ export class WorkspaceMigrationFieldActionsBuilderService extends WorkspaceEntit args: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.fieldMetadata >, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.fieldMetadata, 'update' > { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type.ts index 6724c57aff..393155f0f2 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type.ts @@ -2,6 +2,7 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspac import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; export type FlatCreateFrontComponentAction = BaseFlatCreateWorkspaceMigrationAction<'frontComponent'>; @@ -9,6 +10,9 @@ export type FlatCreateFrontComponentAction = export type FlatUpdateFrontComponentAction = BaseFlatUpdateWorkspaceMigrationAction<'frontComponent'>; +export type UniversalUpdateFrontComponentAction = + BaseUniversalUpdateWorkspaceMigrationAction<'frontComponent'>; + export type UniversalDeleteFrontComponentAction = BaseUniversalDeleteWorkspaceMigrationAction<'frontComponent'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/workspace-migration-front-component-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/workspace-migration-front-component-actions-builder.service.ts index 15449e1617..d6c31b8fd6 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/workspace-migration-front-component-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/workspace-migration-front-component-actions-builder.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { FlatUpdateFrontComponentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type'; +import { UniversalUpdateFrontComponentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatFrontComponentValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-front-component-validator.service'; @Injectable() @@ -20,8 +20,10 @@ export class WorkspaceMigrationFrontComponentActionsBuilderService extends Works } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.frontComponent + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.frontComponent, 'create' > { @@ -50,8 +52,10 @@ export class WorkspaceMigrationFrontComponentActionsBuilderService extends Works } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.frontComponent + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.frontComponent, 'delete' > { @@ -83,7 +87,7 @@ export class WorkspaceMigrationFrontComponentActionsBuilderService extends Works args: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.frontComponent >, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.frontComponent, 'update' > { @@ -99,12 +103,12 @@ export class WorkspaceMigrationFrontComponentActionsBuilderService extends Works }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updateFrontComponentAction: FlatUpdateFrontComponentAction = { + const updateFrontComponentAction: UniversalUpdateFrontComponentAction = { type: 'update', metadataName: 'frontComponent', - entityId: flatEntityId, + universalIdentifier, update: flatEntityUpdate, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action.ts index c1f87199ba..35018af3f9 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action.ts @@ -1,20 +1,31 @@ import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; -export type FlatCreateIndexAction = - BaseFlatCreateWorkspaceMigrationAction<'index'>; +export type UniversalCreateIndexAction = + BaseUniversalCreateWorkspaceMigrationAction<'index'>; + +export type UniversalUpdateIndexAction = + BaseUniversalUpdateWorkspaceMigrationAction<'index'> & { + updatedUniversalFlatIndex: UniversalFlatIndexMetadata; + }; export type UniversalDeleteIndexAction = BaseUniversalDeleteWorkspaceMigrationAction<'index'>; +export type FlatCreateIndexAction = + BaseFlatCreateWorkspaceMigrationAction<'index'>; + export type FlatDeleteIndexAction = BaseFlatDeleteWorkspaceMigrationAction<'index'>; export type FlatUpdateIndexAction = BaseFlatUpdateWorkspaceMigrationAction<'index'> & { - // TODO document - updatedFlatEntity: FlatIndexMetadata; + // Note: Literally drop and create under the hood + updatedFlatIndex: FlatIndexMetadata; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/workspace-migration-index-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/workspace-migration-index-actions-builder.service.ts index 4a34406133..ee1510b64c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/workspace-migration-index-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/workspace-migration-index-actions-builder.service.ts @@ -6,13 +6,13 @@ import { isDefined } from 'twenty-shared/utils'; import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant'; import { FlatEntityMapsExceptionCode } from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; -import { deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/delete-flat-entity-from-flat-entity-maps-through-mutation-or-throw.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; +import { UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; +import { deleteUniversalFlatEntityFromUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/delete-universal-flat-entity-from-universal-flat-entity-maps-through-mutation-or-throw.util'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatIndexValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-index-metadata-validator.service'; @Injectable() @@ -26,8 +26,11 @@ export class WorkspaceMigrationIndexActionsBuilderService extends WorkspaceEntit } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType { + args: UniversalFlatEntityValidationArgs, + ): UniversalFlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.index, + 'create' + > { const validationResult = this.flatIndexValidatorService.validateFlatIndexCreation(args); @@ -51,8 +54,11 @@ export class WorkspaceMigrationIndexActionsBuilderService extends WorkspaceEntit } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType { + args: UniversalFlatEntityValidationArgs, + ): UniversalFlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.index, + 'delete' + > { const validationResult = this.flatIndexValidatorService.validateFlatIndexDeletion(args); @@ -77,16 +83,19 @@ export class WorkspaceMigrationIndexActionsBuilderService extends WorkspaceEntit protected validateFlatEntityUpdate({ optimisticFlatEntityMapsAndRelatedFlatEntityMaps, - flatEntityId, + universalIdentifier, flatEntityUpdate, buildOptions, workspaceId, additionalCacheDataMaps, }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.index - >): FlatEntityValidationReturnType { - const flatEntity = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + >): UniversalFlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.index, + 'update' + > { + const flatEntity = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatIndexMaps, }); @@ -97,7 +106,7 @@ export class WorkspaceMigrationIndexActionsBuilderService extends WorkspaceEntit metadataName: 'index', type: 'update', flatEntityMinimalInformation: { - id: flatEntityId, + universalIdentifier, }, errors: [ { @@ -128,7 +137,7 @@ export class WorkspaceMigrationIndexActionsBuilderService extends WorkspaceEntit }; } - const updatedFlatIndex: FlatIndexMetadata = { + const updatedFlatIndex: UniversalFlatIndexMetadata = { ...flatEntity, ...flatEntityUpdate, }; @@ -137,9 +146,9 @@ export class WorkspaceMigrationIndexActionsBuilderService extends WorkspaceEntit optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatIndexMaps, ); - deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow({ - entityToDeleteId: flatEntity.id, - flatEntityMapsToMutate: tempOptimisticFlatIndexMaps, + deleteUniversalFlatEntityFromUniversalFlatEntityMapsThroughMutationOrThrow({ + universalIdentifierToDelete: flatEntity.universalIdentifier, + universalFlatEntityMapsToMutate: tempOptimisticFlatIndexMaps, }); const creationValidationResult = @@ -171,10 +180,8 @@ export class WorkspaceMigrationIndexActionsBuilderService extends WorkspaceEntit action: { type: 'update', metadataName: 'index', - entityId: flatEntity.id, - // Note: Index update action ignores the native update field - // As under the hood it result as a drop and create - updatedFlatEntity: updatedFlatIndex, + universalIdentifier, + updatedUniversalFlatIndex: updatedFlatIndex, update: {}, }, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type.ts index 25a801dd74..89177fb827 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type.ts @@ -4,6 +4,7 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspac import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; export type FlatCreateLogicFunctionAction = BaseFlatCreateWorkspaceMigrationAction<'logicFunction'>; @@ -13,6 +14,9 @@ export type FlatUpdateLogicFunctionAction = code?: Sources; }; +export type UniversalUpdateLogicFunctionAction = + BaseUniversalUpdateWorkspaceMigrationAction<'logicFunction'>; + export type UniversalDeleteLogicFunctionAction = BaseUniversalDeleteWorkspaceMigrationAction<'logicFunction'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/workspace-migration-logic-function-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/workspace-migration-logic-function-actions-builder.service.ts index fc89f6dce8..af1b654ae1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/workspace-migration-logic-function-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/workspace-migration-logic-function-actions-builder.service.ts @@ -2,16 +2,16 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { FlatUpdateLogicFunctionAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; +import { UniversalUpdateLogicFunctionAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type'; import { ValidateAndBuildArgs, ValidateAndBuildReturnType, WorkspaceEntityMigrationBuilderService, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatLogicFunctionValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-logic-function-validator.service'; @Injectable() @@ -39,8 +39,8 @@ export class WorkspaceMigrationLogicFunctionActionsBuilderService extends Worksp return action; } - const toLogicFunction = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: action.entityId, + const toLogicFunction = findFlatEntityByUniversalIdentifier({ + universalIdentifier: action.universalIdentifier, flatEntityMaps: toFlatEntityMaps, }); @@ -60,8 +60,10 @@ export class WorkspaceMigrationLogicFunctionActionsBuilderService extends Worksp } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.logicFunction + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.logicFunction, 'create' > { @@ -90,8 +92,10 @@ export class WorkspaceMigrationLogicFunctionActionsBuilderService extends Worksp } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.logicFunction + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.logicFunction, 'delete' > { @@ -123,7 +127,7 @@ export class WorkspaceMigrationLogicFunctionActionsBuilderService extends Worksp args: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.logicFunction >, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.logicFunction, 'update' > { @@ -139,12 +143,12 @@ export class WorkspaceMigrationLogicFunctionActionsBuilderService extends Worksp }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updateLogicFunctionAction: FlatUpdateLogicFunctionAction = { + const updateLogicFunctionAction: UniversalUpdateLogicFunctionAction = { type: 'update', metadataName: 'logicFunction', - entityId: flatEntityId, + universalIdentifier, update: flatEntityUpdate, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type.ts index 9af11896c0..549a6c7c76 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type.ts @@ -2,6 +2,7 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspac import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; export type FlatCreateNavigationMenuItemAction = BaseFlatCreateWorkspaceMigrationAction<'navigationMenuItem'>; @@ -9,6 +10,9 @@ export type FlatCreateNavigationMenuItemAction = export type FlatUpdateNavigationMenuItemAction = BaseFlatUpdateWorkspaceMigrationAction<'navigationMenuItem'>; +export type UniversalUpdateNavigationMenuItemAction = + BaseUniversalUpdateWorkspaceMigrationAction<'navigationMenuItem'>; + export type UniversalDeleteNavigationMenuItemAction = BaseUniversalDeleteWorkspaceMigrationAction<'navigationMenuItem'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/workspace-migration-navigation-menu-item-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/workspace-migration-navigation-menu-item-actions-builder.service.ts index 3df3f15a49..f9010698fa 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/workspace-migration-navigation-menu-item-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/workspace-migration-navigation-menu-item-actions-builder.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { FlatUpdateNavigationMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type'; +import { UniversalUpdateNavigationMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatNavigationMenuItemValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-navigation-menu-item-validator.service'; @Injectable() @@ -20,8 +20,10 @@ export class WorkspaceMigrationNavigationMenuItemActionsBuilderService extends W } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.navigationMenuItem + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.navigationMenuItem, 'create' > { @@ -50,8 +52,10 @@ export class WorkspaceMigrationNavigationMenuItemActionsBuilderService extends W } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.navigationMenuItem + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.navigationMenuItem, 'delete' > { @@ -84,7 +88,7 @@ export class WorkspaceMigrationNavigationMenuItemActionsBuilderService extends W args: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.navigationMenuItem >, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.navigationMenuItem, 'update' > { @@ -100,14 +104,15 @@ export class WorkspaceMigrationNavigationMenuItemActionsBuilderService extends W }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updateNavigationMenuItemAction: FlatUpdateNavigationMenuItemAction = { - type: 'update', - metadataName: 'navigationMenuItem', - entityId: flatEntityId, - update: flatEntityUpdate, - }; + const updateNavigationMenuItemAction: UniversalUpdateNavigationMenuItemAction = + { + type: 'update', + metadataName: 'navigationMenuItem', + universalIdentifier, + update: flatEntityUpdate, + }; return { status: 'success', diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/workspace-migration-object-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/workspace-migration-object-actions-builder.service.ts index 587b5f03f6..e1eb970f74 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/workspace-migration-object-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/workspace-migration-object-actions-builder.service.ts @@ -4,9 +4,9 @@ import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { UniversalUpdateObjectAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatObjectMetadataValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-object-metadata-validator.service'; @Injectable() @@ -20,8 +20,10 @@ export class WorkspaceMigrationObjectActionsBuilderService extends WorkspaceEnti } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.objectMetadata + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.objectMetadata, 'create' > { @@ -44,14 +46,15 @@ export class WorkspaceMigrationObjectActionsBuilderService extends WorkspaceEnti metadataName: 'objectMetadata', universalFlatFieldMetadatas: [], flatEntity: flatObjectMetadataToValidate, - id: flatObjectMetadataToValidate.id, }, }; } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.objectMetadata + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.objectMetadata, 'delete' > { @@ -81,7 +84,7 @@ export class WorkspaceMigrationObjectActionsBuilderService extends WorkspaceEnti args: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.objectMetadata >, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.objectMetadata, 'update' > { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type.ts index 22275489e3..9fb7acdfa1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type.ts @@ -2,6 +2,7 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspac import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; export type FlatCreatePageLayoutTabAction = BaseFlatCreateWorkspaceMigrationAction<'pageLayoutTab'>; @@ -9,6 +10,9 @@ export type FlatCreatePageLayoutTabAction = export type FlatUpdatePageLayoutTabAction = BaseFlatUpdateWorkspaceMigrationAction<'pageLayoutTab'>; +export type UniversalUpdatePageLayoutTabAction = + BaseUniversalUpdateWorkspaceMigrationAction<'pageLayoutTab'>; + export type UniversalDeletePageLayoutTabAction = BaseUniversalDeleteWorkspaceMigrationAction<'pageLayoutTab'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/workspace-migration-page-layout-tab-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/workspace-migration-page-layout-tab-actions-builder.service.ts index 1f77875680..5d933972e1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/workspace-migration-page-layout-tab-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/workspace-migration-page-layout-tab-actions-builder.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { FlatUpdatePageLayoutTabAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type'; +import { UniversalUpdatePageLayoutTabAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatPageLayoutTabValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-page-layout-tab-validator.service'; @Injectable() @@ -20,8 +20,10 @@ export class WorkspaceMigrationPageLayoutTabActionsBuilderService extends Worksp } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.pageLayoutTab + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.pageLayoutTab, 'create' > { @@ -50,8 +52,10 @@ export class WorkspaceMigrationPageLayoutTabActionsBuilderService extends Worksp } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.pageLayoutTab + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.pageLayoutTab, 'delete' > { @@ -83,7 +87,7 @@ export class WorkspaceMigrationPageLayoutTabActionsBuilderService extends Worksp args: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.pageLayoutTab >, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.pageLayoutTab, 'update' > { @@ -99,12 +103,12 @@ export class WorkspaceMigrationPageLayoutTabActionsBuilderService extends Worksp }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updatePageLayoutTabAction: FlatUpdatePageLayoutTabAction = { + const updatePageLayoutTabAction: UniversalUpdatePageLayoutTabAction = { type: 'update', metadataName: 'pageLayoutTab', - entityId: flatEntityId, + universalIdentifier, update: flatEntityUpdate, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type.ts index 411b54381c..e23e352a89 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type.ts @@ -2,6 +2,7 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspac import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; export type FlatCreatePageLayoutWidgetAction = BaseFlatCreateWorkspaceMigrationAction<'pageLayoutWidget'>; @@ -9,6 +10,9 @@ export type FlatCreatePageLayoutWidgetAction = export type FlatUpdatePageLayoutWidgetAction = BaseFlatUpdateWorkspaceMigrationAction<'pageLayoutWidget'>; +export type UniversalUpdatePageLayoutWidgetAction = + BaseUniversalUpdateWorkspaceMigrationAction<'pageLayoutWidget'>; + export type UniversalDeletePageLayoutWidgetAction = BaseUniversalDeleteWorkspaceMigrationAction<'pageLayoutWidget'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/workspace-migration-page-layout-widget-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/workspace-migration-page-layout-widget-actions-builder.service.ts index d82c537e42..bd359bfd4c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/workspace-migration-page-layout-widget-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/workspace-migration-page-layout-widget-actions-builder.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { FlatUpdatePageLayoutWidgetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type'; +import { UniversalUpdatePageLayoutWidgetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatPageLayoutWidgetValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-page-layout-widget-validator.service'; @Injectable() @@ -20,9 +20,11 @@ export class WorkspaceMigrationPageLayoutWidgetActionsBuilderService extends Wor } protected async validateFlatEntityCreation( - args: FlatEntityValidationArgs, + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.pageLayoutWidget + >, ): Promise< - FlatEntityValidationReturnType< + UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.pageLayoutWidget, 'create' > @@ -50,8 +52,10 @@ export class WorkspaceMigrationPageLayoutWidgetActionsBuilderService extends Wor } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.pageLayoutWidget + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.pageLayoutWidget, 'delete' > { @@ -84,7 +88,7 @@ export class WorkspaceMigrationPageLayoutWidgetActionsBuilderService extends Wor typeof ALL_METADATA_NAME.pageLayoutWidget >, ): Promise< - FlatEntityValidationReturnType< + UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.pageLayoutWidget, 'update' > @@ -101,14 +105,15 @@ export class WorkspaceMigrationPageLayoutWidgetActionsBuilderService extends Wor }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updatePageLayoutWidgetAction: FlatUpdatePageLayoutWidgetAction = { - type: 'update', - metadataName: 'pageLayoutWidget', - entityId: flatEntityId, - update: flatEntityUpdate, - }; + const updatePageLayoutWidgetAction: UniversalUpdatePageLayoutWidgetAction = + { + type: 'update', + metadataName: 'pageLayoutWidget', + universalIdentifier, + update: flatEntityUpdate, + }; return { status: 'success', diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type.ts index b5199db4aa..97335956d3 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type.ts @@ -2,6 +2,7 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspac import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; export type FlatCreatePageLayoutAction = BaseFlatCreateWorkspaceMigrationAction<'pageLayout'>; @@ -9,6 +10,9 @@ export type FlatCreatePageLayoutAction = export type FlatUpdatePageLayoutAction = BaseFlatUpdateWorkspaceMigrationAction<'pageLayout'>; +export type UniversalUpdatePageLayoutAction = + BaseUniversalUpdateWorkspaceMigrationAction<'pageLayout'>; + export type UniversalDeletePageLayoutAction = BaseUniversalDeleteWorkspaceMigrationAction<'pageLayout'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/workspace-migration-page-layout-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/workspace-migration-page-layout-actions-builder.service.ts index 014d673c59..ece7070cd6 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/workspace-migration-page-layout-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/workspace-migration-page-layout-actions-builder.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { FlatUpdatePageLayoutAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type'; +import { UniversalUpdatePageLayoutAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatPageLayoutValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-page-layout-validator.service'; @Injectable() @@ -20,9 +20,11 @@ export class WorkspaceMigrationPageLayoutActionsBuilderService extends Workspace } protected async validateFlatEntityCreation( - args: FlatEntityValidationArgs, + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.pageLayout + >, ): Promise< - FlatEntityValidationReturnType< + UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.pageLayout, 'create' > @@ -50,8 +52,10 @@ export class WorkspaceMigrationPageLayoutActionsBuilderService extends Workspace } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.pageLayout + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.pageLayout, 'delete' > { @@ -80,7 +84,7 @@ export class WorkspaceMigrationPageLayoutActionsBuilderService extends Workspace protected async validateFlatEntityUpdate( args: FlatEntityUpdateValidationArgs, ): Promise< - FlatEntityValidationReturnType< + UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.pageLayout, 'update' > @@ -95,12 +99,12 @@ export class WorkspaceMigrationPageLayoutActionsBuilderService extends Workspace }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updatePageLayoutAction: FlatUpdatePageLayoutAction = { + const updatePageLayoutAction: UniversalUpdatePageLayoutAction = { type: 'update', metadataName: 'pageLayout', - entityId: flatEntityId, + universalIdentifier, update: flatEntityUpdate, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type.ts index 454ddcf79f..9dfec974be 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type.ts @@ -2,6 +2,7 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspac import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; export type FlatCreateRoleTargetAction = BaseFlatCreateWorkspaceMigrationAction<'roleTarget'>; @@ -9,6 +10,9 @@ export type FlatCreateRoleTargetAction = export type FlatUpdateRoleTargetAction = BaseFlatUpdateWorkspaceMigrationAction<'roleTarget'>; +export type UniversalUpdateRoleTargetAction = + BaseUniversalUpdateWorkspaceMigrationAction<'roleTarget'>; + export type UniversalDeleteRoleTargetAction = BaseUniversalDeleteWorkspaceMigrationAction<'roleTarget'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/workspace-migration-role-target-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/workspace-migration-role-target-actions-builder.service.ts index 22f67bcdd8..c00bac2bbe 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/workspace-migration-role-target-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/workspace-migration-role-target-actions-builder.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { FlatUpdateRoleTargetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type'; +import { UniversalUpdateRoleTargetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatRoleTargetValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-role-target-validator.service'; @Injectable() @@ -20,8 +20,10 @@ export class WorkspaceMigrationRoleTargetActionsBuilderService extends Workspace } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.roleTarget + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.roleTarget, 'create' > { @@ -48,8 +50,10 @@ export class WorkspaceMigrationRoleTargetActionsBuilderService extends Workspace } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.roleTarget + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.roleTarget, 'delete' > { @@ -77,7 +81,7 @@ export class WorkspaceMigrationRoleTargetActionsBuilderService extends Workspace protected validateFlatEntityUpdate( args: FlatEntityUpdateValidationArgs, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.roleTarget, 'update' > { @@ -91,12 +95,12 @@ export class WorkspaceMigrationRoleTargetActionsBuilderService extends Workspace }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updateRoleTargetAction: FlatUpdateRoleTargetAction = { + const updateRoleTargetAction: UniversalUpdateRoleTargetAction = { type: 'update', metadataName: 'roleTarget', - entityId: flatEntityId, + universalIdentifier, update: flatEntityUpdate, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type.ts index 3a949b88e8..c3e039e1f6 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type.ts @@ -2,6 +2,7 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspac import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; export type FlatCreateRoleAction = BaseFlatCreateWorkspaceMigrationAction<'role'>; @@ -9,6 +10,9 @@ export type FlatCreateRoleAction = export type FlatUpdateRoleAction = BaseFlatUpdateWorkspaceMigrationAction<'role'>; +export type UniversalUpdateRoleAction = + BaseUniversalUpdateWorkspaceMigrationAction<'role'>; + export type UniversalDeleteRoleAction = BaseUniversalDeleteWorkspaceMigrationAction<'role'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/workspace-migration-role-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/workspace-migration-role-actions-builder.service.ts index 8fc39743a1..263d5da7c3 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/workspace-migration-role-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/workspace-migration-role-actions-builder.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { FlatUpdateRoleAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type'; +import { UniversalUpdateRoleAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatRoleValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-role-validator.service'; @Injectable() @@ -20,8 +20,11 @@ export class WorkspaceMigrationRoleActionsBuilderService extends WorkspaceEntity } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType { + args: UniversalFlatEntityValidationArgs, + ): UniversalFlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.role, + 'create' + > { const validationResult = this.flatRoleValidatorService.validateFlatRoleCreation(args); @@ -45,8 +48,11 @@ export class WorkspaceMigrationRoleActionsBuilderService extends WorkspaceEntity } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType { + args: UniversalFlatEntityValidationArgs, + ): UniversalFlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.role, + 'delete' + > { const validationResult = this.flatRoleValidatorService.validateFlatRoleDeletion(args); @@ -71,7 +77,10 @@ export class WorkspaceMigrationRoleActionsBuilderService extends WorkspaceEntity protected validateFlatEntityUpdate( args: FlatEntityUpdateValidationArgs, - ): FlatEntityValidationReturnType { + ): UniversalFlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.role, + 'update' + > { const validationResult = this.flatRoleValidatorService.validateFlatRoleUpdate(args); @@ -82,12 +91,12 @@ export class WorkspaceMigrationRoleActionsBuilderService extends WorkspaceEntity }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updateRoleAction: FlatUpdateRoleAction = { + const updateRoleAction: UniversalUpdateRoleAction = { type: 'update', metadataName: 'role', - entityId: flatEntityId, + universalIdentifier, update: flatEntityUpdate, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type.ts index b974dbccb9..d6d290cdf3 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type.ts @@ -4,6 +4,7 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspac import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; export type FlatCreateRowLevelPermissionPredicateGroupAction = BaseFlatCreateWorkspaceMigrationAction<'rowLevelPermissionPredicateGroup'>; @@ -11,6 +12,9 @@ export type FlatCreateRowLevelPermissionPredicateGroupAction = export type FlatUpdateRowLevelPermissionPredicateGroupAction = BaseFlatUpdateWorkspaceMigrationAction<'rowLevelPermissionPredicateGroup'>; +export type UniversalUpdateRowLevelPermissionPredicateGroupAction = + BaseUniversalUpdateWorkspaceMigrationAction<'rowLevelPermissionPredicateGroup'>; + export type UniversalDeleteRowLevelPermissionPredicateGroupAction = BaseUniversalDeleteWorkspaceMigrationAction<'rowLevelPermissionPredicateGroup'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/workspace-migration-row-level-permission-predicate-group-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/workspace-migration-row-level-permission-predicate-group-actions-builder.service.ts index a45628f16d..dd85c7dc30 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/workspace-migration-row-level-permission-predicate-group-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/workspace-migration-row-level-permission-predicate-group-actions-builder.service.ts @@ -4,11 +4,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { FlatUpdateRowLevelPermissionPredicateGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type'; +import { UniversalUpdateRowLevelPermissionPredicateGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatRowLevelPermissionPredicateGroupValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-row-level-permission-predicate-group-validator.service'; @Injectable() @@ -22,10 +22,10 @@ export class WorkspaceMigrationRowLevelPermissionPredicateGroupActionsBuilderSer } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs< + args: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.rowLevelPermissionPredicateGroup >, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.rowLevelPermissionPredicateGroup, 'create' > { @@ -54,10 +54,10 @@ export class WorkspaceMigrationRowLevelPermissionPredicateGroupActionsBuilderSer } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs< + args: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.rowLevelPermissionPredicateGroup >, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.rowLevelPermissionPredicateGroup, 'delete' > { @@ -93,7 +93,7 @@ export class WorkspaceMigrationRowLevelPermissionPredicateGroupActionsBuilderSer args: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.rowLevelPermissionPredicateGroup >, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.rowLevelPermissionPredicateGroup, 'update' > { @@ -109,14 +109,15 @@ export class WorkspaceMigrationRowLevelPermissionPredicateGroupActionsBuilderSer }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updateAction: FlatUpdateRowLevelPermissionPredicateGroupAction = { - type: 'update', - metadataName: 'rowLevelPermissionPredicateGroup', - entityId: flatEntityId, - update: flatEntityUpdate, - }; + const updateAction: UniversalUpdateRowLevelPermissionPredicateGroupAction = + { + type: 'update', + metadataName: 'rowLevelPermissionPredicateGroup', + universalIdentifier, + update: flatEntityUpdate, + }; return { status: 'success', diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type.ts index 1e70446b27..b5d9d5dcd2 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type.ts @@ -4,6 +4,7 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspac import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; export type FlatCreateRowLevelPermissionPredicateAction = BaseFlatCreateWorkspaceMigrationAction<'rowLevelPermissionPredicate'>; @@ -11,6 +12,9 @@ export type FlatCreateRowLevelPermissionPredicateAction = export type FlatUpdateRowLevelPermissionPredicateAction = BaseFlatUpdateWorkspaceMigrationAction<'rowLevelPermissionPredicate'>; +export type UniversalUpdateRowLevelPermissionPredicateAction = + BaseUniversalUpdateWorkspaceMigrationAction<'rowLevelPermissionPredicate'>; + export type UniversalDeleteRowLevelPermissionPredicateAction = BaseUniversalDeleteWorkspaceMigrationAction<'rowLevelPermissionPredicate'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/workspace-migration-row-level-permission-predicate-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/workspace-migration-row-level-permission-predicate-actions-builder.service.ts index 17736b7dfb..6b44f125a2 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/workspace-migration-row-level-permission-predicate-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/workspace-migration-row-level-permission-predicate-actions-builder.service.ts @@ -4,11 +4,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { FlatUpdateRowLevelPermissionPredicateAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type'; +import { UniversalUpdateRowLevelPermissionPredicateAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatRowLevelPermissionPredicateValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-row-level-permission-predicate-validator.service'; @Injectable() @@ -22,10 +22,10 @@ export class WorkspaceMigrationRowLevelPermissionPredicateActionsBuilderService } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs< + args: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.rowLevelPermissionPredicate >, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.rowLevelPermissionPredicate, 'create' > { @@ -54,10 +54,10 @@ export class WorkspaceMigrationRowLevelPermissionPredicateActionsBuilderService } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs< + args: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.rowLevelPermissionPredicate >, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.rowLevelPermissionPredicate, 'delete' > { @@ -93,7 +93,7 @@ export class WorkspaceMigrationRowLevelPermissionPredicateActionsBuilderService args: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.rowLevelPermissionPredicate >, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.rowLevelPermissionPredicate, 'update' > { @@ -109,12 +109,12 @@ export class WorkspaceMigrationRowLevelPermissionPredicateActionsBuilderService }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updateAction: FlatUpdateRowLevelPermissionPredicateAction = { + const updateAction: UniversalUpdateRowLevelPermissionPredicateAction = { type: 'update', metadataName: 'rowLevelPermissionPredicate', - entityId: flatEntityId, + universalIdentifier, update: flatEntityUpdate, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type.ts index b1989bc12d..d640d2e7fd 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type.ts @@ -1,7 +1,9 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; export type FlatCreateSkillAction = BaseFlatCreateWorkspaceMigrationAction<'skill'>; @@ -9,8 +11,14 @@ export type FlatCreateSkillAction = export type FlatUpdateSkillAction = BaseFlatUpdateWorkspaceMigrationAction<'skill'>; +export type FlatDeleteSkillAction = + BaseFlatDeleteWorkspaceMigrationAction<'skill'>; + +export type UniversalUpdateSkillAction = + BaseUniversalUpdateWorkspaceMigrationAction<'skill'>; + export type UniversalDeleteSkillAction = BaseUniversalDeleteWorkspaceMigrationAction<'skill'>; -export type FlatDeleteSkillAction = - BaseFlatDeleteWorkspaceMigrationAction<'skill'>; +export type UniversalCreateSkillAction = + BaseUniversalCreateWorkspaceMigrationAction<'skill'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/workspace-migration-skill-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/workspace-migration-skill-actions-builder.service.ts index f0693aaa2e..e06257228f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/workspace-migration-skill-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/workspace-migration-skill-actions-builder.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { FlatUpdateSkillAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type'; +import { UniversalUpdateSkillAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatSkillValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-skill-validator.service'; @Injectable() @@ -20,8 +20,11 @@ export class WorkspaceMigrationSkillActionsBuilderService extends WorkspaceEntit } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType { + args: UniversalFlatEntityValidationArgs, + ): UniversalFlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.skill, + 'create' + > { const validationResult = this.flatSkillValidatorService.validateFlatSkillCreation(args); @@ -45,8 +48,11 @@ export class WorkspaceMigrationSkillActionsBuilderService extends WorkspaceEntit } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType { + args: UniversalFlatEntityValidationArgs, + ): UniversalFlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.skill, + 'delete' + > { const validationResult = this.flatSkillValidatorService.validateFlatSkillDeletion(args); @@ -71,7 +77,10 @@ export class WorkspaceMigrationSkillActionsBuilderService extends WorkspaceEntit protected validateFlatEntityUpdate( args: FlatEntityUpdateValidationArgs, - ): FlatEntityValidationReturnType { + ): UniversalFlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.skill, + 'update' + > { const validationResult = this.flatSkillValidatorService.validateFlatSkillUpdate(args); @@ -82,12 +91,12 @@ export class WorkspaceMigrationSkillActionsBuilderService extends WorkspaceEntit }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updateSkillAction: FlatUpdateSkillAction = { + const updateSkillAction: UniversalUpdateSkillAction = { type: 'update', metadataName: 'skill', - entityId: flatEntityId, + universalIdentifier, update: flatEntityUpdate, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type.ts index 56e64d2d9e..e52515d9c7 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type.ts @@ -18,6 +18,5 @@ export type FailedFlatEntityValidation< type: TAcionType; metadataName: TMetadataName; errors: FlatEntityValidationError[]; - flatEntityMinimalInformation: Pick, 'id'> & - Partial, 'id'>>; + flatEntityMinimalInformation: Partial>; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type.ts index cea1e0ee72..05640f8824 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type.ts @@ -1,7 +1,12 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; + +export type UniversalCreateViewFieldAction = + BaseUniversalCreateWorkspaceMigrationAction<'viewField'>; export type FlatCreateViewFieldAction = BaseFlatCreateWorkspaceMigrationAction<'viewField'>; @@ -9,6 +14,9 @@ export type FlatCreateViewFieldAction = export type FlatUpdateViewFieldAction = BaseFlatUpdateWorkspaceMigrationAction<'viewField'>; +export type UniversalUpdateViewFieldAction = + BaseUniversalUpdateWorkspaceMigrationAction<'viewField'>; + export type UniversalDeleteViewFieldAction = BaseUniversalDeleteWorkspaceMigrationAction<'viewField'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/workspace-migration-view-field-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/workspace-migration-view-field-actions-builder.service.ts index 3c7ec6305f..76ea737823 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/workspace-migration-view-field-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/workspace-migration-view-field-actions-builder.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { FlatUpdateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type'; +import { UniversalUpdateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatViewFieldValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-field-validator.service'; @Injectable() @@ -20,8 +20,8 @@ export class WorkspaceMigrationViewFieldActionsBuilderService extends WorkspaceE } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.viewField, 'create' > { @@ -46,8 +46,8 @@ export class WorkspaceMigrationViewFieldActionsBuilderService extends WorkspaceE } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.viewField, 'delete' > { @@ -75,7 +75,7 @@ export class WorkspaceMigrationViewFieldActionsBuilderService extends WorkspaceE protected validateFlatEntityUpdate( args: FlatEntityUpdateValidationArgs, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.viewField, 'update' > { @@ -89,12 +89,12 @@ export class WorkspaceMigrationViewFieldActionsBuilderService extends WorkspaceE }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updateViewFieldAction: FlatUpdateViewFieldAction = { + const updateViewFieldAction: UniversalUpdateViewFieldAction = { type: 'update', metadataName: 'viewField', - entityId: flatEntityId, + universalIdentifier, update: flatEntityUpdate, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type.ts index 2eb6e503ac..0d2f4f6381 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type.ts @@ -1,7 +1,12 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; + +export type UniversalCreateViewFilterGroupAction = + BaseUniversalCreateWorkspaceMigrationAction<'viewFilterGroup'>; export type FlatCreateViewFilterGroupAction = BaseFlatCreateWorkspaceMigrationAction<'viewFilterGroup'>; @@ -9,6 +14,9 @@ export type FlatCreateViewFilterGroupAction = export type FlatUpdateViewFilterGroupAction = BaseFlatUpdateWorkspaceMigrationAction<'viewFilterGroup'>; +export type UniversalUpdateViewFilterGroupAction = + BaseUniversalUpdateWorkspaceMigrationAction<'viewFilterGroup'>; + export type UniversalDeleteViewFilterGroupAction = BaseUniversalDeleteWorkspaceMigrationAction<'viewFilterGroup'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/workspace-migration-view-filter-group-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/workspace-migration-view-filter-group-actions-builder.service.ts index 742bbe6688..c9d62a137a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/workspace-migration-view-filter-group-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/workspace-migration-view-filter-group-actions-builder.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { type FlatUpdateViewFilterGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type'; +import { type UniversalUpdateViewFilterGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { type FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { type FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { type UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { type UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatViewFilterGroupValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-filter-group-validator.service'; @Injectable() @@ -20,8 +20,10 @@ export class WorkspaceMigrationViewFilterGroupActionsBuilderService extends Work } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.viewFilterGroup + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.viewFilterGroup, 'create' > { @@ -50,8 +52,10 @@ export class WorkspaceMigrationViewFilterGroupActionsBuilderService extends Work } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.viewFilterGroup + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.viewFilterGroup, 'delete' > { @@ -83,7 +87,7 @@ export class WorkspaceMigrationViewFilterGroupActionsBuilderService extends Work args: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.viewFilterGroup >, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.viewFilterGroup, 'update' > { @@ -99,12 +103,12 @@ export class WorkspaceMigrationViewFilterGroupActionsBuilderService extends Work }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updateViewFilterGroupAction: FlatUpdateViewFilterGroupAction = { + const updateViewFilterGroupAction: UniversalUpdateViewFilterGroupAction = { type: 'update', metadataName: 'viewFilterGroup', - entityId: flatEntityId, + universalIdentifier, update: flatEntityUpdate, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type.ts index 0eeeeeb80f..88448f5839 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type.ts @@ -1,7 +1,12 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; + +export type UniversalCreateViewFilterAction = + BaseUniversalCreateWorkspaceMigrationAction<'viewFilter'>; export type FlatCreateViewFilterAction = BaseFlatCreateWorkspaceMigrationAction<'viewFilter'>; @@ -9,6 +14,9 @@ export type FlatCreateViewFilterAction = export type FlatUpdateViewFilterAction = BaseFlatUpdateWorkspaceMigrationAction<'viewFilter'>; +export type UniversalUpdateViewFilterAction = + BaseUniversalUpdateWorkspaceMigrationAction<'viewFilter'>; + export type UniversalDeleteViewFilterAction = BaseUniversalDeleteWorkspaceMigrationAction<'viewFilter'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/workspace-migration-view-filter-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/workspace-migration-view-filter-actions-builder.service.ts index 9eface68e1..c431300601 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/workspace-migration-view-filter-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/workspace-migration-view-filter-actions-builder.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { FlatUpdateViewFilterAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type'; +import { UniversalUpdateViewFilterAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatViewFilterValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-filter-validator.service'; @Injectable() @@ -20,8 +20,10 @@ export class WorkspaceMigrationViewFilterActionsBuilderService extends Workspace } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.viewFilter + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.viewFilter, 'create' > { @@ -48,8 +50,10 @@ export class WorkspaceMigrationViewFilterActionsBuilderService extends Workspace } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs< + typeof ALL_METADATA_NAME.viewFilter + >, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.viewFilter, 'delete' > { @@ -77,7 +81,7 @@ export class WorkspaceMigrationViewFilterActionsBuilderService extends Workspace protected validateFlatEntityUpdate( args: FlatEntityUpdateValidationArgs, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.viewFilter, 'update' > { @@ -91,12 +95,12 @@ export class WorkspaceMigrationViewFilterActionsBuilderService extends Workspace }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updateViewFilterAction: FlatUpdateViewFilterAction = { + const updateViewFilterAction: UniversalUpdateViewFilterAction = { type: 'update', metadataName: 'viewFilter', - entityId: flatEntityId, + universalIdentifier, update: flatEntityUpdate, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type.ts index e97b79d50f..79f576c393 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type.ts @@ -1,7 +1,12 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; + +export type UniversalCreateViewGroupAction = + BaseUniversalCreateWorkspaceMigrationAction<'viewGroup'>; export type FlatCreateViewGroupAction = BaseFlatCreateWorkspaceMigrationAction<'viewGroup'>; @@ -9,6 +14,9 @@ export type FlatCreateViewGroupAction = export type FlatUpdateViewGroupAction = BaseFlatUpdateWorkspaceMigrationAction<'viewGroup'>; +export type UniversalUpdateViewGroupAction = + BaseUniversalUpdateWorkspaceMigrationAction<'viewGroup'>; + export type UniversalDeleteViewGroupAction = BaseUniversalDeleteWorkspaceMigrationAction<'viewGroup'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/workspace-migration-view-group-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/workspace-migration-view-group-actions-builder.service.ts index 4d5603635e..af7edec2d4 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/workspace-migration-view-group-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/workspace-migration-view-group-actions-builder.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { FlatUpdateViewGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type'; +import { UniversalUpdateViewGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatViewGroupValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-group-validator.service'; @Injectable() @@ -20,8 +20,8 @@ export class WorkspaceMigrationViewGroupActionsBuilderService extends WorkspaceE } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.viewGroup, 'create' > { @@ -48,8 +48,8 @@ export class WorkspaceMigrationViewGroupActionsBuilderService extends WorkspaceE } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.viewGroup, 'delete' > { @@ -77,7 +77,7 @@ export class WorkspaceMigrationViewGroupActionsBuilderService extends WorkspaceE protected validateFlatEntityUpdate( args: FlatEntityUpdateValidationArgs, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.viewGroup, 'update' > { @@ -91,12 +91,12 @@ export class WorkspaceMigrationViewGroupActionsBuilderService extends WorkspaceE }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updateViewGroupAction: FlatUpdateViewGroupAction = { + const updateViewGroupAction: UniversalUpdateViewGroupAction = { type: 'update', metadataName: 'viewGroup', - entityId: flatEntityId, + universalIdentifier, update: flatEntityUpdate, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type.ts index b47b802e6c..71b2fbcae1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type.ts @@ -1,7 +1,12 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; + +export type UniversalCreateViewAction = + BaseUniversalCreateWorkspaceMigrationAction<'view'>; export type FlatCreateViewAction = BaseFlatCreateWorkspaceMigrationAction<'view'>; @@ -9,6 +14,9 @@ export type FlatCreateViewAction = export type FlatUpdateViewAction = BaseFlatUpdateWorkspaceMigrationAction<'view'>; +export type UniversalUpdateViewAction = + BaseUniversalUpdateWorkspaceMigrationAction<'view'>; + export type UniversalDeleteViewAction = BaseUniversalDeleteWorkspaceMigrationAction<'view'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/workspace-migration-view-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/workspace-migration-view-actions-builder.service.ts index 9cc2e240ca..7f7033bf5e 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/workspace-migration-view-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/workspace-migration-view-actions-builder.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { FlatUpdateViewAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type'; +import { UniversalUpdateViewAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatViewValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-validator.service'; @Injectable() @@ -20,8 +20,11 @@ export class WorkspaceMigrationViewActionsBuilderService extends WorkspaceEntity } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType { + args: UniversalFlatEntityValidationArgs, + ): UniversalFlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.view, + 'create' + > { const validationResult = this.flatViewValidatorService.validateFlatViewCreation(args); @@ -45,8 +48,11 @@ export class WorkspaceMigrationViewActionsBuilderService extends WorkspaceEntity } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType { + args: UniversalFlatEntityValidationArgs, + ): UniversalFlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.view, + 'delete' + > { const validationResult = this.flatViewValidatorService.validateFlatViewDeletion(args); @@ -71,7 +77,10 @@ export class WorkspaceMigrationViewActionsBuilderService extends WorkspaceEntity protected validateFlatEntityUpdate( args: FlatEntityUpdateValidationArgs, - ): FlatEntityValidationReturnType { + ): UniversalFlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.view, + 'update' + > { const validationResult = this.flatViewValidatorService.validateFlatViewUpdate(args); @@ -82,12 +91,12 @@ export class WorkspaceMigrationViewActionsBuilderService extends WorkspaceEntity }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updateViewAction: FlatUpdateViewAction = { + const updateViewAction: UniversalUpdateViewAction = { type: 'update', metadataName: 'view', - entityId: flatEntityId, + universalIdentifier, update: flatEntityUpdate, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type.ts index b8d68c3238..ff32248832 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type.ts @@ -2,6 +2,7 @@ import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspac import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; export type FlatCreateWebhookAction = BaseFlatCreateWorkspaceMigrationAction<'webhook'>; @@ -9,6 +10,9 @@ export type FlatCreateWebhookAction = export type FlatUpdateWebhookAction = BaseFlatUpdateWorkspaceMigrationAction<'webhook'>; +export type UniversalUpdateWebhookAction = + BaseUniversalUpdateWorkspaceMigrationAction<'webhook'>; + export type UniversalDeleteWebhookAction = BaseUniversalDeleteWorkspaceMigrationAction<'webhook'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/workspace-migration-webhook-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/workspace-migration-webhook-actions-builder.service.ts index 6055d0e95a..379b73c47c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/workspace-migration-webhook-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/workspace-migration-webhook-actions-builder.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { FlatUpdateWebhookAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type'; +import { UniversalUpdateWebhookAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { FlatWebhookValidatorService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-webhook-validator.service'; @Injectable() @@ -20,8 +20,8 @@ export class WorkspaceMigrationWebhookActionsBuilderService extends WorkspaceEnt } protected validateFlatEntityCreation( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.webhook, 'create' > { @@ -48,8 +48,8 @@ export class WorkspaceMigrationWebhookActionsBuilderService extends WorkspaceEnt } protected validateFlatEntityDeletion( - args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType< + args: UniversalFlatEntityValidationArgs, + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.webhook, 'delete' > { @@ -77,7 +77,7 @@ export class WorkspaceMigrationWebhookActionsBuilderService extends WorkspaceEnt protected validateFlatEntityUpdate( args: FlatEntityUpdateValidationArgs, - ): FlatEntityValidationReturnType< + ): UniversalFlatEntityValidationReturnType< typeof ALL_METADATA_NAME.webhook, 'update' > { @@ -91,12 +91,12 @@ export class WorkspaceMigrationWebhookActionsBuilderService extends WorkspaceEnt }; } - const { flatEntityId, flatEntityUpdate } = args; + const { universalIdentifier, flatEntityUpdate } = args; - const updateWebhookAction: FlatUpdateWebhookAction = { + const updateWebhookAction: UniversalUpdateWebhookAction = { type: 'update', metadataName: 'webhook', - entityId: flatEntityId, + universalIdentifier, update: flatEntityUpdate, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service.ts index ab83b8336c..7248f35c3b 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service.ts @@ -9,34 +9,34 @@ import { FlatEntityMapsException, FlatEntityMapsExceptionCode, } from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; -import { MetadataFlatEntityAndRelatedFlatEntityMapsForValidation } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-and-related-flat-entity-maps-for-validation.type'; -import { MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; -import { MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; -import { MetadataValidationRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; -import { addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.util'; -import { deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.util'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { MetadataUniversalFlatEntityAndRelatedFlatEntityMapsForValidation } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-and-related-flat-entity-maps-for-validation.type'; +import { MetadataValidationRelatedUniversalFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; +import { MetadataUniversalFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-universal-flat-entity.type'; import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; import { WorkspaceMigrationBuilderAdditionalCacheDataMaps } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-builder-additional-cache-data-maps.type'; -import { deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/delete-flat-entity-from-flat-entity-maps-through-mutation-or-throw.util'; -import { flatEntityDeletedCreatedUpdatedMatrixDispatcher } from 'src/engine/workspace-manager/workspace-migration/utils/flat-entity-deleted-created-updated-matrix-dispatcher.util'; +import { MetadataUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-maps.type'; +import { addUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util'; +import { deleteUniversalFlatEntityFromUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/delete-universal-flat-entity-from-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util'; +import { deleteUniversalFlatEntityFromUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/delete-universal-flat-entity-from-universal-flat-entity-maps-through-mutation-or-throw.util'; +import { replaceUniversalFlatEntityInUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/replace-universal-flat-entity-in-universal-flat-entity-maps-through-mutation-or-throw.util'; +import { flatEntityDeletedCreatedUpdatedMatrixDispatcher } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/universal-flat-entity-deleted-created-updated-matrix-dispatcher.util'; import { getMetadataEmptyWorkspaceMigrationActionRecord } from 'src/engine/workspace-manager/workspace-migration/utils/get-metadata-empty-workspace-migration-action-record.util'; -import { replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/replace-flat-entity-in-flat-entity-maps-through-mutation-or-throw.util'; import { shouldInferDeletionFromMissingEntities } from 'src/engine/workspace-manager/workspace-migration/utils/should-infer-deletion-from-missing-entities.util'; import { FailedFlatEntityValidateAndBuild } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/failed-flat-entity-validate-and-build.type'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; -import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type'; import { SuccessfulFlatEntityValidateAndBuild } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/successful-flat-entity-validate-and-build.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type'; import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-builder-options.type'; export type ValidateAndBuildArgs = { buildOptions: WorkspaceMigrationBuilderOptions; - dependencyOptimisticFlatEntityMaps: MetadataValidationRelatedFlatEntityMaps; + dependencyOptimisticFlatEntityMaps: MetadataValidationRelatedUniversalFlatEntityMaps; workspaceId: string; additionalCacheDataMaps: WorkspaceMigrationBuilderAdditionalCacheDataMaps; -} & FromTo>; +} & FromTo>; export type ValidateAndBuildReturnType = Promise< SuccessfulFlatEntityValidateAndBuild | FailedFlatEntityValidateAndBuild @@ -95,7 +95,7 @@ export abstract class WorkspaceEntityMigrationBuilderService< const optimisticFlatEntityMapsAndRelatedFlatEntityMaps = { [flatEntityMapsKey]: structuredClone(fromFlatEntityMaps), ...structuredClone(inputDependencyOptimisticFlatEntityMaps), - } as MetadataFlatEntityAndRelatedFlatEntityMapsForValidation; + } as MetadataUniversalFlatEntityAndRelatedFlatEntityMapsForValidation; const actionsResult = getMetadataEmptyWorkspaceMigrationActionRecord( this.metadataName, @@ -116,12 +116,14 @@ export abstract class WorkspaceEntityMigrationBuilderService< flatEntityMaps: createdFlatEntityMaps, }); - const flatEntityToCreateId = flatEntityToCreate.id; + const flatEntityToCreateId = flatEntityToCreate.universalIdentifier; - deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow({ - entityToDeleteId: flatEntityToCreateId, - flatEntityMapsToMutate: remainingFlatEntityMapsToCreate, - }); + deleteUniversalFlatEntityFromUniversalFlatEntityMapsThroughMutationOrThrow( + { + universalIdentifierToDelete: flatEntityToCreateId, + universalFlatEntityMapsToMutate: remainingFlatEntityMapsToCreate, + }, + ); const validationResult = await this.validateFlatEntityCreation({ additionalCacheDataMaps, @@ -137,12 +139,14 @@ export abstract class WorkspaceEntityMigrationBuilderService< continue; } - addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow({ - flatEntity: flatEntityToCreate, - flatEntityAndRelatedMapsToMutate: - optimisticFlatEntityMapsAndRelatedFlatEntityMaps, - metadataName: this.metadataName, - }); + addUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow( + { + universalFlatEntity: flatEntityToCreate, + universalFlatEntityAndRelatedMapsToMutate: + optimisticFlatEntityMapsAndRelatedFlatEntityMaps, + metadataName: this.metadataName, + }, + ); actionsResult.create.push( ...(Array.isArray(validationResult.action) @@ -164,33 +168,31 @@ export abstract class WorkspaceEntityMigrationBuilderService< deletedFlatEntityMaps, ); - const flatEntityToDeleteIds = shouldInferDeletionFromMissingEntities({ - buildOptions, - metadataName: this.metadataName, - }) - ? Object.keys(deletedFlatEntityMaps.universalIdentifierById) + const universalIdentifiersToDelete = shouldInferDeletionFromMissingEntities( + { + buildOptions, + metadataName: this.metadataName, + }, + ) + ? Object.keys(deletedFlatEntityMaps.byUniversalIdentifier) : []; - for (const flatEntityToDeleteId of flatEntityToDeleteIds) { - const flatEntityToDelete = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatEntityToDeleteId, - flatEntityMaps: deletedFlatEntityMaps, - }); + for (const universalIdentifierToDelete of universalIdentifiersToDelete) { + deleteUniversalFlatEntityFromUniversalFlatEntityMapsThroughMutationOrThrow( + { + universalIdentifierToDelete, + universalFlatEntityMapsToMutate: remainingFlatEntityMapsToDelete, + }, + ); - if (!isDefined(flatEntityToDelete)) { - throw new FlatEntityMapsException( - 'Could not find flat entity to delete in maps should never occur', - FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND, - ); - } - - deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow({ - entityToDeleteId: flatEntityToDeleteId, - flatEntityMapsToMutate: remainingFlatEntityMapsToDelete, - }); + const universalFlatEntityToDelete = + findFlatEntityByUniversalIdentifierOrThrow({ + universalIdentifier: universalIdentifierToDelete, + flatEntityMaps: deletedFlatEntityMaps, + }); const validationResult = await this.validateFlatEntityDeletion({ - flatEntityToValidate: flatEntityToDelete, + flatEntityToValidate: universalFlatEntityToDelete, workspaceId, remainingFlatEntityMapsToValidate: remainingFlatEntityMapsToDelete, buildOptions, @@ -203,12 +205,14 @@ export abstract class WorkspaceEntityMigrationBuilderService< continue; } - deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThrow({ - flatEntity: flatEntityToDelete, - flatEntityAndRelatedMapsToMutate: - optimisticFlatEntityMapsAndRelatedFlatEntityMaps, - metadataName: this.metadataName, - }); + deleteUniversalFlatEntityFromUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow( + { + universalFlatEntity: universalFlatEntityToDelete, + universalFlatEntityAndRelatedMapsToMutate: + optimisticFlatEntityMapsAndRelatedFlatEntityMaps, + metadataName: this.metadataName, + }, + ); actionsResult.delete.push( ...(Array.isArray(validationResult.action) @@ -224,12 +228,12 @@ export abstract class WorkspaceEntityMigrationBuilderService< this.logger.time(`EntityBuilder ${this.metadataName}`, 'update validation'); for (const flatEntityToUpdateUniversalIdentifier in updatedFlatEntityMaps.byUniversalIdentifier) { - const flatEntityToUpdate = + const flatEntityUpdate = updatedFlatEntityMaps.byUniversalIdentifier[ flatEntityToUpdateUniversalIdentifier ]; - if (!isDefined(flatEntityToUpdate)) { + if (!isDefined(flatEntityUpdate)) { throw new FlatEntityMapsException( 'Could not find flat entity updates in maps dispatcher should never occur', FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND, @@ -237,8 +241,7 @@ export abstract class WorkspaceEntityMigrationBuilderService< } const validationResult = await this.validateFlatEntityUpdate({ - flatEntityUpdate: flatEntityToUpdate.update, - flatEntityId: flatEntityToUpdate.id, + flatEntityUpdate: flatEntityUpdate.update, optimisticFlatEntityMapsAndRelatedFlatEntityMaps, workspaceId, buildOptions, @@ -251,11 +254,12 @@ export abstract class WorkspaceEntityMigrationBuilderService< continue; } - const existingFlatEntity = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatEntityToUpdate.id, - flatEntityMaps: optimisticFlatEntityMapsAndRelatedFlatEntityMaps[ - flatEntityMapsKey - ] as MetadataFlatEntityMaps, + const existingFlatEntity = findFlatEntityByUniversalIdentifier< + MetadataUniversalFlatEntity + >({ + universalIdentifier: flatEntityToUpdateUniversalIdentifier, + flatEntityMaps: + optimisticFlatEntityMapsAndRelatedFlatEntityMaps[flatEntityMapsKey], }); if (!isDefined(existingFlatEntity)) { @@ -265,16 +269,18 @@ export abstract class WorkspaceEntityMigrationBuilderService< ); } - const updatedFlatEntity: MetadataFlatEntity = { + const updatedFlatEntity: MetadataUniversalFlatEntity = { ...existingFlatEntity, - ...flatEntityToUpdate.update, + ...flatEntityUpdate.update, }; - replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({ - flatEntity: updatedFlatEntity, - flatEntityMapsToMutate: - optimisticFlatEntityMapsAndRelatedFlatEntityMaps[flatEntityMapsKey], - }); + replaceUniversalFlatEntityInUniversalFlatEntityMapsThroughMutationOrThrow( + { + universalFlatEntity: updatedFlatEntity, + universalFlatEntityMapsToMutate: + optimisticFlatEntityMapsAndRelatedFlatEntityMaps[flatEntityMapsKey], + }, + ); actionsResult.update.push( ...(Array.isArray(validationResult.action) @@ -313,20 +319,20 @@ export abstract class WorkspaceEntityMigrationBuilderService< } protected abstract validateFlatEntityCreation( - args: FlatEntityValidationArgs, + args: UniversalFlatEntityValidationArgs, ): - | FlatEntityValidationReturnType - | Promise>; + | UniversalFlatEntityValidationReturnType + | Promise>; protected abstract validateFlatEntityDeletion( - args: FlatEntityValidationArgs, + args: UniversalFlatEntityValidationArgs, ): - | FlatEntityValidationReturnType - | Promise>; + | UniversalFlatEntityValidationReturnType + | Promise>; protected abstract validateFlatEntityUpdate( args: FlatEntityUpdateValidationArgs, ): - | FlatEntityValidationReturnType - | Promise>; + | UniversalFlatEntityValidationReturnType + | Promise>; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type.ts index 86499321aa..876c85b0e0 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type.ts @@ -1,6 +1,6 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; -import { type FlatEntityUpdate } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type'; +import { type FlatEntityUpdate } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-update.type'; import { type WORKSPACE_MIGRATION_ACTION_TYPE } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/constants/workspace-migration-action-type.constant'; export type BaseFlatUpdateWorkspaceMigrationAction = diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type.ts index 075c036c60..b093d6d019 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type.ts @@ -6,7 +6,6 @@ import { type WORKSPACE_MIGRATION_ACTION_TYPE } from 'src/engine/workspace-manag export type BaseUniversalCreateWorkspaceMigrationAction< T extends AllMetadataName, > = { - // TODO prastoin rename to universalFlatEntity ? flatEntity: MetadataUniversalFlatEntity; type: typeof WORKSPACE_MIGRATION_ACTION_TYPE.create; metadataName: T; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type.ts index 3b4086c8fd..30b0490a53 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type.ts @@ -1,6 +1,6 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; -import { type FlatEntityUpdate } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type'; +import { type UniversalFlatEntityUpdate } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-update.type'; import { type WORKSPACE_MIGRATION_ACTION_TYPE } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/constants/workspace-migration-action-type.constant'; export type BaseUniversalUpdateWorkspaceMigrationAction< @@ -9,5 +9,5 @@ export type BaseUniversalUpdateWorkspaceMigrationAction< type: typeof WORKSPACE_MIGRATION_ACTION_TYPE.update; metadataName: T; universalIdentifier: string; - update: FlatEntityUpdate; + update: UniversalFlatEntityUpdate; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/failed-flat-entity-validate-and-build.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/failed-flat-entity-validate-and-build.type.ts index 83d7340ddb..6be93a1fe2 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/failed-flat-entity-validate-and-build.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/failed-flat-entity-validate-and-build.type.ts @@ -1,11 +1,11 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; -import { type MetadataFlatEntityAndRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; +import { type MetadataUniversalFlatEntityAndRelatedUniversalFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; import { type WorkspaceMigrationActionType } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; export type FailedFlatEntityValidateAndBuild = { status: 'fail'; errors: FailedFlatEntityValidation[]; - optimisticFlatEntityMapsAndRelatedFlatEntityMaps: MetadataFlatEntityAndRelatedFlatEntityMaps; + optimisticFlatEntityMapsAndRelatedFlatEntityMaps: MetadataUniversalFlatEntityAndRelatedUniversalFlatEntityMaps; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type.ts deleted file mode 100644 index 8f52d3182b..0000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { type AllMetadataName } from 'twenty-shared/metadata'; - -import { type FlatEntityUpdate } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type'; -import { type FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; - -export type FlatEntityUpdateValidationArgs = Omit< - FlatEntityValidationArgs, - 'flatEntityToValidate' | 'remainingFlatEntityMapsToValidate' -> & { - flatEntityId: string; - flatEntityUpdate: FlatEntityUpdate; - universalIdentifier: string; -}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type.ts deleted file mode 100644 index e799c910ce..0000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { type AllMetadataName } from 'twenty-shared/metadata'; - -import { type MetadataFlatEntityAndRelatedFlatEntityMapsForValidation } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-and-related-flat-entity-maps-for-validation.type'; -import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; -import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; -import { type WorkspaceMigrationBuilderAdditionalCacheDataMaps } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-builder-additional-cache-data-maps.type'; -import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-builder-options.type'; - -export type FlatEntityValidationArgs = { - additionalCacheDataMaps: WorkspaceMigrationBuilderAdditionalCacheDataMaps; - flatEntityToValidate: MetadataFlatEntity; - optimisticFlatEntityMapsAndRelatedFlatEntityMaps: MetadataFlatEntityAndRelatedFlatEntityMapsForValidation; - workspaceId: string; - remainingFlatEntityMapsToValidate: MetadataFlatEntityMaps; - buildOptions: WorkspaceMigrationBuilderOptions; -}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/successful-flat-entity-validate-and-build.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/successful-flat-entity-validate-and-build.type.ts index 4b65620421..fc7e4f7f9b 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/successful-flat-entity-validate-and-build.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/successful-flat-entity-validate-and-build.type.ts @@ -1,10 +1,10 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; -import { type MetadataFlatEntityAndRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; +import { type MetadataUniversalFlatEntityAndRelatedUniversalFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; import { type MetadataUniversalWorkspaceMigrationActionsRecord } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type'; export type SuccessfulFlatEntityValidateAndBuild = { status: 'success'; actions: MetadataUniversalWorkspaceMigrationActionsRecord; - optimisticFlatEntityMapsAndRelatedFlatEntityMaps: MetadataFlatEntityAndRelatedFlatEntityMaps; + optimisticFlatEntityMapsAndRelatedFlatEntityMaps: MetadataUniversalFlatEntityAndRelatedUniversalFlatEntityMaps; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type.ts new file mode 100644 index 0000000000..d1cf1a5560 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type.ts @@ -0,0 +1,12 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type UniversalFlatEntityUpdate } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-update.type'; +import { type UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; + +export type FlatEntityUpdateValidationArgs = Omit< + UniversalFlatEntityValidationArgs, + 'flatEntityToValidate' | 'remainingFlatEntityMapsToValidate' +> & { + flatEntityUpdate: UniversalFlatEntityUpdate; + universalIdentifier: string; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type.ts new file mode 100644 index 0000000000..bf33e36b20 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type.ts @@ -0,0 +1,16 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type MetadataUniversalFlatEntityAndRelatedFlatEntityMapsForValidation } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-and-related-flat-entity-maps-for-validation.type'; +import { type MetadataUniversalFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-universal-flat-entity.type'; +import { type WorkspaceMigrationBuilderAdditionalCacheDataMaps } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-builder-additional-cache-data-maps.type'; +import { type MetadataUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-maps.type'; +import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-builder-options.type'; + +export type UniversalFlatEntityValidationArgs = { + additionalCacheDataMaps: WorkspaceMigrationBuilderAdditionalCacheDataMaps; + flatEntityToValidate: MetadataUniversalFlatEntity; + optimisticFlatEntityMapsAndRelatedFlatEntityMaps: MetadataUniversalFlatEntityAndRelatedFlatEntityMapsForValidation; + workspaceId: string; + remainingFlatEntityMapsToValidate: MetadataUniversalFlatEntityMaps; + buildOptions: WorkspaceMigrationBuilderOptions; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type.ts similarity index 93% rename from packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type.ts rename to packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type.ts index 1d001e91b2..2c1d4f48eb 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-result.type.ts @@ -6,7 +6,7 @@ import { } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; -export type FlatEntityValidationReturnType< +export type UniversalFlatEntityValidationReturnType< TMetadataName extends AllMetadataName, TACtionType extends WorkspaceMigrationActionType, > = diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-agent-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-agent-validator.service.ts index 019e6139b8..3d6cc7c8e9 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-agent-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-agent-validator.service.ts @@ -6,12 +6,12 @@ import { isDefined } from 'twenty-shared/utils'; import { AgentExceptionCode } from 'src/engine/metadata-modules/ai/ai-agent/agent.exception'; import { type FlatAgent } from 'src/engine/metadata-modules/flat-agent/types/flat-agent.type'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { type FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { type UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; import { validateAgentNameUniqueness } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-agent-name-uniqueness.util'; import { validateAgentRequiredProperties } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-agent-required-properties.util'; import { validateAgentResponseFormat } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-agent-response-format.util'; @@ -23,12 +23,11 @@ export class FlatAgentValidatorService { optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatAgentMaps: optimisticFlatAgentMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.agent >): FailedFlatEntityValidation<'agent', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatAgent.id, universalIdentifier: flatAgent.universalIdentifier, name: flatAgent.name, }, @@ -70,12 +69,11 @@ export class FlatAgentValidatorService { flatAgentMaps: optimisticFlatAgentMaps, }, buildOptions, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.agent >): FailedFlatEntityValidation<'agent', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityToValidate.id, universalIdentifier: flatEntityToValidate.universalIdentifier, name: flatEntityToValidate.name, }, @@ -83,8 +81,8 @@ export class FlatAgentValidatorService { type: 'delete', }); - const existingAgent = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatEntityToValidate.id, + const existingAgent = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatEntityToValidate.universalIdentifier, flatEntityMaps: optimisticFlatAgentMaps, }); @@ -117,7 +115,7 @@ export class FlatAgentValidatorService { } public validateFlatAgentUpdate({ - flatEntityId, + universalIdentifier, flatEntityUpdate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatAgentMaps: optimisticFlatAgentMaps, @@ -126,15 +124,14 @@ export class FlatAgentValidatorService { }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.agent >): FailedFlatEntityValidation<'agent', 'update'> { - const fromFlatAgent = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const fromFlatAgent = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatAgentMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: fromFlatAgent?.universalIdentifier, + universalIdentifier, }, metadataName: 'agent', type: 'update', @@ -174,7 +171,7 @@ export class FlatAgentValidatorService { optimisticFlatAgentMaps.byUniversalIdentifier, ) .filter(isDefined) - .filter((agent) => agent.id !== flatEntityId); + .filter((agent) => agent.universalIdentifier !== universalIdentifier); validationResult.errors.push( ...validateAgentRequiredProperties({ diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-command-menu-item-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-command-menu-item-validator.service.ts index 91a645fe88..9b6b27fd6f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-command-menu-item-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-command-menu-item-validator.service.ts @@ -6,22 +6,21 @@ import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; import { CommandMenuItemExceptionCode } from 'src/engine/metadata-modules/command-menu-item/command-menu-item.exception'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { type FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { type UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; @Injectable() export class FlatCommandMenuItemValidatorService { public validateFlatCommandMenuItemCreation({ flatEntityToValidate: flatCommandMenuItem, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.commandMenuItem >): FailedFlatEntityValidation<'commandMenuItem', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatCommandMenuItem.id, universalIdentifier: flatCommandMenuItem.universalIdentifier, }, metadataName: 'commandMenuItem', @@ -57,20 +56,19 @@ export class FlatCommandMenuItemValidatorService { optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatCommandMenuItemMaps: optimisticFlatCommandMenuItemMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.commandMenuItem >): FailedFlatEntityValidation<'commandMenuItem', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityToValidate.id, universalIdentifier: flatEntityToValidate.universalIdentifier, }, metadataName: 'commandMenuItem', type: 'delete', }); - const existingCommandMenuItem = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatEntityToValidate.id, + const existingCommandMenuItem = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatEntityToValidate.universalIdentifier, flatEntityMaps: optimisticFlatCommandMenuItemMaps, }); @@ -86,7 +84,7 @@ export class FlatCommandMenuItemValidatorService { } public validateFlatCommandMenuItemUpdate({ - flatEntityId, + universalIdentifier, flatEntityUpdate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatCommandMenuItemMaps: optimisticFlatCommandMenuItemMaps, @@ -94,15 +92,14 @@ export class FlatCommandMenuItemValidatorService { }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.commandMenuItem >): FailedFlatEntityValidation<'commandMenuItem', 'update'> { - const fromFlatCommandMenuItem = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const fromFlatCommandMenuItem = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatCommandMenuItemMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: fromFlatCommandMenuItem?.universalIdentifier, + universalIdentifier, }, metadataName: 'commandMenuItem', type: 'update', diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-field-metadata-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-field-metadata-validator.service.ts index 041ab4185d..0b034b751e 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-field-metadata-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-field-metadata-validator.service.ts @@ -6,19 +6,19 @@ import { isDefined } from 'twenty-shared/utils'; import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { FLAT_FIELD_METADATA_RELATION_PROPERTIES_TO_COMPARE } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-relation-properties-to-compare.constant'; import { FlatFieldMetadataTypeValidatorService } from 'src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-type-validator.service'; import { FlatFieldMetadataRelationPropertiesToCompare } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-relation-properties-to-compare.type'; import { isFlatFieldMetadataNameSyncedWithLabel } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-name-synced-with-label.util'; -import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; +import { isMorphOrRelationUniversalFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; import { validateFlatFieldMetadataNameAvailability } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name-availability.util'; import { validateFlatFieldMetadataName } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name.util'; import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util'; import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; @Injectable() export class FlatFieldMetadataValidatorService { @@ -27,7 +27,7 @@ export class FlatFieldMetadataValidatorService { ) {} validateFlatFieldMetadataUpdate({ - flatEntityId, + universalIdentifier, flatEntityUpdate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatFieldMetadataMaps: optimisticFlatFieldMetadataMaps, @@ -40,16 +40,14 @@ export class FlatFieldMetadataValidatorService { typeof ALL_METADATA_NAME.fieldMetadata >): FailedFlatEntityValidation<'fieldMetadata', 'update'> { const existingFlatFieldMetadataToUpdate = - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatFieldMetadataMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: - existingFlatFieldMetadataToUpdate?.universalIdentifier, + universalIdentifier, }, metadataName: 'fieldMetadata', type: 'update', @@ -72,13 +70,14 @@ export class FlatFieldMetadataValidatorService { validationResult.flatEntityMinimalInformation = { ...validationResult.flatEntityMinimalInformation, - id: flatFieldMetadataToValidate.id, name: flatFieldMetadataToValidate.name, - objectMetadataId: flatFieldMetadataToValidate.objectMetadataId, + objectMetadataUniversalIdentifier: + flatFieldMetadataToValidate.objectMetadataUniversalIdentifier, }; - const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatFieldMetadataToValidate.objectMetadataId, + const flatObjectMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatFieldMetadataToValidate.objectMetadataUniversalIdentifier, flatEntityMaps: flatObjectMetadataMaps, }); @@ -92,15 +91,19 @@ export class FlatFieldMetadataValidatorService { return validationResult; } - if (!isDefined(flatObjectMetadata.labelIdentifierFieldMetadataId)) { + if ( + !isDefined( + flatObjectMetadata.labelIdentifierFieldMetadataUniversalIdentifier, + ) + ) { validationResult.errors.push({ code: FieldMetadataExceptionCode.LABEL_IDENTIFIER_FIELD_METADATA_ID_NOT_FOUND, message: 'Label identifier field metadata id does not exist', userFriendlyMessage: msg`Object related to updated field does not have a label identifier`, }); } else if ( - flatObjectMetadata.labelIdentifierFieldMetadataId === - flatFieldMetadataToValidate.id && + flatObjectMetadata.labelIdentifierFieldMetadataUniversalIdentifier === + flatFieldMetadataToValidate.universalIdentifier && isDefined(flatEntityUpdate.isActive) && flatFieldMetadataToValidate.isActive === false ) { @@ -112,7 +115,9 @@ export class FlatFieldMetadataValidatorService { } // Should be moved in relation field validator - if (isMorphOrRelationFlatFieldMetadata(flatFieldMetadataToValidate)) { + if ( + isMorphOrRelationUniversalFlatFieldMetadata(flatFieldMetadataToValidate) + ) { const updatedProperties = Object.keys(flatEntityUpdate); const relationNonEditableUpdatedProperties = updatedProperties.filter( (property) => @@ -139,8 +144,8 @@ export class FlatFieldMetadataValidatorService { }), ...validateFlatFieldMetadataNameAvailability({ name: flatFieldMetadataToValidate.name, - flatFieldMetadataMaps: optimisticFlatFieldMetadataMaps, - flatObjectMetadata, + universalFlatFieldMetadataMaps: optimisticFlatFieldMetadataMaps, + universalFlatObjectMetadata: flatObjectMetadata, buildOptions, }), ); @@ -195,31 +200,27 @@ export class FlatFieldMetadataValidatorService { } validateFlatFieldMetadataDeletion({ - flatEntityToValidate: { - id: flatFieldMetadataToDeleteId, - universalIdentifier, - }, + flatEntityToValidate: { universalIdentifier }, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatFieldMetadataMaps: optimisticFlatFieldMetadataMaps, flatObjectMetadataMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.fieldMetadata >): FailedFlatEntityValidation<'fieldMetadata', 'delete'> { + const flatFieldMetadataToDelete = findFlatEntityByUniversalIdentifier({ + universalIdentifier, + flatEntityMaps: optimisticFlatFieldMetadataMaps, + }); + const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatFieldMetadataToDeleteId, universalIdentifier, }, metadataName: 'fieldMetadata', type: 'delete', }); - const flatFieldMetadataToDelete = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatFieldMetadataToDeleteId, - flatEntityMaps: optimisticFlatFieldMetadataMaps, - }); - if (!isDefined(flatFieldMetadataToDelete)) { validationResult.errors.push({ code: FieldMetadataExceptionCode.FIELD_METADATA_NOT_FOUND, @@ -233,18 +234,20 @@ export class FlatFieldMetadataValidatorService { validationResult.flatEntityMinimalInformation = { ...validationResult.flatEntityMinimalInformation, name: flatFieldMetadataToDelete.name, - objectMetadataId: flatFieldMetadataToDelete.objectMetadataId, + objectMetadataUniversalIdentifier: + flatFieldMetadataToDelete.objectMetadataUniversalIdentifier, }; - const relatedFlatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatFieldMetadataToDelete.objectMetadataId, + const relatedFlatObjectMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatFieldMetadataToDelete.objectMetadataUniversalIdentifier, flatEntityMaps: flatObjectMetadataMaps, }); if ( isDefined(relatedFlatObjectMetadata) && - relatedFlatObjectMetadata.labelIdentifierFieldMetadataId === - flatFieldMetadataToDelete.id + relatedFlatObjectMetadata.labelIdentifierFieldMetadataUniversalIdentifier === + flatFieldMetadataToDelete.universalIdentifier ) { validationResult.errors.push({ code: FieldMetadataExceptionCode.FIELD_MUTATION_NOT_ALLOWED, @@ -255,17 +258,18 @@ export class FlatFieldMetadataValidatorService { } const relationTargetObjectMetadataHasBeenDeleted = - isMorphOrRelationFlatFieldMetadata(flatFieldMetadataToDelete) && + isMorphOrRelationUniversalFlatFieldMetadata(flatFieldMetadataToDelete) && !isDefined( - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: - flatFieldMetadataToDelete.relationTargetObjectMetadataId, + findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatFieldMetadataToDelete.relationTargetObjectMetadataUniversalIdentifier, flatEntityMaps: flatObjectMetadataMaps, }), ); const parentObjectMetadataHasBeenDeleted = !isDefined( - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatFieldMetadataToDelete.objectMetadataId, + findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatFieldMetadataToDelete.objectMetadataUniversalIdentifier, flatEntityMaps: flatObjectMetadataMaps, }), ); @@ -295,22 +299,23 @@ export class FlatFieldMetadataValidatorService { buildOptions, remainingFlatEntityMapsToValidate, additionalCacheDataMaps, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.fieldMetadata >): FailedFlatEntityValidation<'fieldMetadata', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatFieldMetadataToValidate.id, universalIdentifier: flatFieldMetadataToValidate.universalIdentifier, name: flatFieldMetadataToValidate.name, - objectMetadataId: flatFieldMetadataToValidate.objectMetadataId, + objectMetadataUniversalIdentifier: + flatFieldMetadataToValidate.objectMetadataUniversalIdentifier, }, metadataName: 'fieldMetadata', type: 'create', }); - const parentFlatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatFieldMetadataToValidate.objectMetadataId, + const parentFlatObjectMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatFieldMetadataToValidate.objectMetadataUniversalIdentifier, flatEntityMaps: flatObjectMetadataMaps, }); @@ -323,15 +328,17 @@ export class FlatFieldMetadataValidatorService { } else { if ( isDefined( - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatFieldMetadataToValidate.id, + findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatFieldMetadataToValidate.universalIdentifier, flatEntityMaps: optimisticFlatFieldMetadataMaps, }), ) ) { validationResult.errors.push({ code: FieldMetadataExceptionCode.FIELD_ALREADY_EXISTS, - message: 'Field with same id already exists in object', + message: + 'Field with same universal identifier already exists in object', userFriendlyMessage: msg`Field already exists`, }); } @@ -347,8 +354,8 @@ export class FlatFieldMetadataValidatorService { validationResult.errors.push( ...validateFlatFieldMetadataNameAvailability({ name: flatFieldMetadataToValidate.name, - flatFieldMetadataMaps: optimisticFlatFieldMetadataMaps, - flatObjectMetadata: parentFlatObjectMetadata, + universalFlatFieldMetadataMaps: optimisticFlatFieldMetadataMaps, + universalFlatObjectMetadata: parentFlatObjectMetadata, buildOptions, }), ); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-front-component-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-front-component-validator.service.ts index 3429c36c4a..3d7bdd19c6 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-front-component-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-front-component-validator.service.ts @@ -5,23 +5,22 @@ import { isNonEmptyString } from '@sniptt/guards'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { FrontComponentExceptionCode } from 'src/engine/metadata-modules/front-component/front-component.exception'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { type FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { type UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; @Injectable() export class FlatFrontComponentValidatorService { public validateFlatFrontComponentCreation({ flatEntityToValidate: flatFrontComponent, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.frontComponent >): FailedFlatEntityValidation<'frontComponent', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatFrontComponent.id, universalIdentifier: flatFrontComponent.universalIdentifier, name: flatFrontComponent.name, }, @@ -45,12 +44,11 @@ export class FlatFrontComponentValidatorService { optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatFrontComponentMaps: optimisticFlatFrontComponentMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.frontComponent >): FailedFlatEntityValidation<'frontComponent', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityToValidate.id, universalIdentifier: flatEntityToValidate.universalIdentifier, name: flatEntityToValidate.name, }, @@ -58,8 +56,8 @@ export class FlatFrontComponentValidatorService { type: 'delete', }); - const existingFrontComponent = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatEntityToValidate.id, + const existingFrontComponent = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatEntityToValidate.universalIdentifier, flatEntityMaps: optimisticFlatFrontComponentMaps, }); @@ -77,22 +75,21 @@ export class FlatFrontComponentValidatorService { } public validateFlatFrontComponentUpdate({ - flatEntityId, + universalIdentifier, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatFrontComponentMaps: optimisticFlatFrontComponentMaps, }, }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.frontComponent >): FailedFlatEntityValidation<'frontComponent', 'update'> { - const fromFlatFrontComponent = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const fromFlatFrontComponent = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatFrontComponentMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: fromFlatFrontComponent?.universalIdentifier, + universalIdentifier, }, metadataName: 'frontComponent', type: 'update', diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-index-metadata-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-index-metadata-validator.service.ts index 3fe6ba53e4..4d63bd4cd4 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-index-metadata-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-index-metadata-validator.service.ts @@ -9,12 +9,12 @@ import { import { isDefined } from 'twenty-shared/utils'; import { FlatEntityMapsExceptionCode } from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { isCompositeFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; +import { isCompositeUniversalFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util'; import { IndexExceptionCode } from 'src/engine/metadata-modules/flat-index-metadata/exceptions/index-exception-code'; import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; @Injectable() export class FlatIndexValidatorService { @@ -22,21 +22,20 @@ export class FlatIndexValidatorService { optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatIndexMaps: optimisticFlatIndexMaps, }, - flatEntityToValidate: { id: indexIdToDelete, universalIdentifier }, - }: FlatEntityValidationArgs< + flatEntityToValidate: { universalIdentifier }, + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.index >): FailedFlatEntityValidation<'index', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: indexIdToDelete, universalIdentifier, }, metadataName: 'index', type: 'delete', }); - const existingFlatIndexToDelete = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: indexIdToDelete, + const existingFlatIndexToDelete = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatIndexMaps, }); @@ -57,12 +56,11 @@ export class FlatIndexValidatorService { flatObjectMetadataMaps, flatFieldMetadataMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.index >): FailedFlatEntityValidation<'index', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatIndexToValidate.id, universalIdentifier: flatIndexToValidate.universalIdentifier, name: flatIndexToValidate.name, }, @@ -70,21 +68,22 @@ export class FlatIndexValidatorService { type: 'create', }); - const existingFlatIndex = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatIndexToValidate.id, + const existingFlatIndex = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatIndexToValidate.universalIdentifier, flatEntityMaps: optimisticFlatIndexMaps, }); if (isDefined(existingFlatIndex)) { validationResult.errors.push({ code: IndexExceptionCode.INDEX_ALREADY_EXISTS, - message: t`Index with same id already exists`, + message: t`Index with same universal identifier already exists`, userFriendlyMessage: msg`Index already exists`, }); } - const relatedObjectMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatIndexToValidate.objectMetadataId, + const relatedObjectMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatIndexToValidate.objectMetadataUniversalIdentifier, flatEntityMaps: flatObjectMetadataMaps, }); @@ -114,99 +113,93 @@ export class FlatIndexValidatorService { }); } - if (flatIndexToValidate.flatIndexFieldMetadatas.length === 0) { + if (flatIndexToValidate.universalFlatIndexFieldMetadatas.length === 0) { validationResult.errors.push({ code: IndexExceptionCode.INDEX_EMPTY_FIELDS, message: t`Index must have at least one field`, userFriendlyMessage: msg`An index must contain at least one field`, }); } else { - flatIndexToValidate.flatIndexFieldMetadatas.forEach((flatIndexField) => { - const relatedFlatField = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatIndexField.fieldMetadataId, - flatEntityMaps: flatFieldMetadataMaps, - }); - - if (!isDefined(relatedFlatField)) { - validationResult.errors.push({ - code: IndexExceptionCode.INDEX_FIELD_NOT_FOUND, - message: t`Could not find index field related field metadata`, - userFriendlyMessage: msg`Field referenced in index does not exist`, + flatIndexToValidate.universalFlatIndexFieldMetadatas.forEach( + (universalFlatIndexField) => { + const relatedFlatField = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + universalFlatIndexField.fieldMetadataUniversalIdentifier, + flatEntityMaps: flatFieldMetadataMaps, }); - } else { + + if (!isDefined(relatedFlatField)) { + validationResult.errors.push({ + code: IndexExceptionCode.INDEX_FIELD_NOT_FOUND, + message: t`Could not find index field related field metadata`, + userFriendlyMessage: msg`Field referenced in index does not exist`, + }); + } else { + if ( + relatedFlatField.objectMetadataUniversalIdentifier !== + flatIndexToValidate.objectMetadataUniversalIdentifier + ) { + validationResult.errors.push({ + code: IndexExceptionCode.INDEX_FIELD_WRONG_OBJECT, + message: t`Field does not belong to the indexed object`, + userFriendlyMessage: msg`Field cannot be indexed as it belongs to a different object`, + }); + } + + if (flatIndexToValidate.isUnique) { + if ( + isDefined(relatedFlatField.defaultValue) && + relatedFlatField.isUnique + ) { + const fieldName = relatedFlatField.name; + const fieldType = relatedFlatField.type; + + validationResult.errors.push({ + code: IndexExceptionCode.INDEX_FIELD_INVALID_DEFAULT_VALUE, + message: t`Unique index cannot be created for field ${fieldName} of type ${fieldType}`, + userFriendlyMessage: msg`${fieldType} fields cannot have a default value.`, + }); + } + + const isCompositeFieldWithNonIncludedUniqueConstraint = + isCompositeUniversalFlatFieldMetadata(relatedFlatField) && + !compositeTypeDefinitions + .get(relatedFlatField.type) + ?.properties.some( + (property) => property.isIncludedInUniqueConstraint, + ); + + if ( + [ + FieldMetadataType.MORPH_RELATION, + FieldMetadataType.RELATION, + ].includes(relatedFlatField.type) || + isCompositeFieldWithNonIncludedUniqueConstraint + ) { + const fieldType = relatedFlatField.type; + const fieldName = relatedFlatField.name; + + validationResult.errors.push({ + code: IndexExceptionCode.INDEX_FIELD_INVALID_TYPE_FOR_UNIQUE, + message: t`Unique index cannot be created for field ${fieldName} of type ${fieldType}`, + userFriendlyMessage: msg`${fieldType} fields cannot be unique.`, + }); + } + } + } + if ( - relatedFlatField.objectMetadataId !== - flatIndexToValidate.objectMetadataId + universalFlatIndexField.indexMetadataUniversalIdentifier !== + flatIndexToValidate.universalIdentifier ) { validationResult.errors.push({ - code: IndexExceptionCode.INDEX_FIELD_WRONG_OBJECT, - message: t`Field does not belong to the indexed object`, - userFriendlyMessage: msg`Field cannot be indexed as it belongs to a different object`, + code: IndexExceptionCode.INDEX_FIELD_INVALID_REFERENCE, + message: t`Index field references incorrect index metadata`, + userFriendlyMessage: msg`Index field has an invalid reference`, }); } - - if (flatIndexToValidate.isUnique) { - if ( - isDefined(relatedFlatField.defaultValue) && - relatedFlatField.isUnique - ) { - const fieldName = relatedFlatField.name; - const fieldType = relatedFlatField.type; - - validationResult.errors.push({ - code: IndexExceptionCode.INDEX_FIELD_INVALID_DEFAULT_VALUE, - message: t`Unique index cannot be created for field ${fieldName} of type ${fieldType}`, - userFriendlyMessage: msg`${fieldType} fields cannot have a default value.`, - }); - } - - const isCompositeFieldWithNonIncludedUniqueConstraint = - isCompositeFlatFieldMetadata(relatedFlatField) && - !compositeTypeDefinitions - .get(relatedFlatField.type) - ?.properties.some( - (property) => property.isIncludedInUniqueConstraint, - ); - - if ( - [ - FieldMetadataType.MORPH_RELATION, - FieldMetadataType.RELATION, - ].includes(relatedFlatField.type) || - isCompositeFieldWithNonIncludedUniqueConstraint - ) { - const fieldType = relatedFlatField.type; - const fieldName = relatedFlatField.name; - - validationResult.errors.push({ - code: IndexExceptionCode.INDEX_FIELD_INVALID_TYPE_FOR_UNIQUE, - message: t`Unique index cannot be created for field ${fieldName} of type ${fieldType}`, - userFriendlyMessage: msg`${fieldType} fields cannot be unique.`, - }); - } - } - } - - if (flatIndexField.indexMetadataId !== flatIndexToValidate.id) { - validationResult.errors.push({ - code: IndexExceptionCode.INDEX_FIELD_INVALID_REFERENCE, - message: t`Index field references incorrect index metadata`, - userFriendlyMessage: msg`Index field has an invalid reference`, - }); - } - - if ( - allExistingFlatIndex.some(({ flatIndexFieldMetadatas }) => - flatIndexFieldMetadatas.some(({ id }) => id === flatIndexField.id), - ) - ) { - validationResult.errors.push({ - code: IndexExceptionCode.INDEX_FIELD_ID_DUPLICATE, - message: t`Index field ID already exists in another index`, - userFriendlyMessage: msg`Field ID is already used in another index`, - }); - } - }); + }, + ); } return validationResult; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-logic-function-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-logic-function-validator.service.ts index 0c7526efd2..bf0ebc305a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-logic-function-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-logic-function-validator.service.ts @@ -4,34 +4,33 @@ import { msg, t } from '@lingui/core/macro'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { LogicFunctionExceptionCode } from 'src/engine/metadata-modules/logic-function/logic-function.exception'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; @Injectable() export class FlatLogicFunctionValidatorService { constructor() {} public validateFlatLogicFunctionUpdate({ - flatEntityId, + universalIdentifier, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatLogicFunctionMaps: optimisticFlatLogicFunctionMaps, }, }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.logicFunction >): FailedFlatEntityValidation<'logicFunction', 'update'> { - const existingFlatLogicFunction = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const existingFlatLogicFunction = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatLogicFunctionMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: existingFlatLogicFunction?.universalIdentifier, + universalIdentifier, }, metadataName: 'logicFunction', type: 'update', @@ -49,24 +48,23 @@ export class FlatLogicFunctionValidatorService { } public validateFlatLogicFunctionDeletion({ - flatEntityToValidate: { id: logicFunctionIdToDelete, universalIdentifier }, + flatEntityToValidate: { universalIdentifier }, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatLogicFunctionMaps: optimisticFlatLogicFunctionMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.logicFunction >): FailedFlatEntityValidation<'logicFunction', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: logicFunctionIdToDelete, universalIdentifier, }, metadataName: 'logicFunction', type: 'delete', }); - const existingFlatLogicFunction = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: logicFunctionIdToDelete, + const existingFlatLogicFunction = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatLogicFunctionMaps, }); @@ -86,12 +84,11 @@ export class FlatLogicFunctionValidatorService { optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatLogicFunctionMaps: optimisticFlatLogicFunctionMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.logicFunction >): FailedFlatEntityValidation<'logicFunction', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatLogicFunctionToValidate.id, universalIdentifier: flatLogicFunctionToValidate.universalIdentifier, }, metadataName: 'logicFunction', @@ -100,15 +97,15 @@ export class FlatLogicFunctionValidatorService { if ( isDefined( - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatLogicFunctionToValidate.id, + findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatLogicFunctionToValidate.universalIdentifier, flatEntityMaps: optimisticFlatLogicFunctionMaps, }), ) ) { validationResult.errors.push({ code: LogicFunctionExceptionCode.LOGIC_FUNCTION_ALREADY_EXIST, - message: t`Logic function with same id already exists`, + message: t`Logic function with same universal identifier already exists`, userFriendlyMessage: msg`Logic function already exists`, }); } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-navigation-menu-item-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-navigation-menu-item-validator.service.ts index b134d4fa29..d5f0f0fd8a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-navigation-menu-item-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-navigation-menu-item-validator.service.ts @@ -4,8 +4,8 @@ import { msg, t } from '@lingui/core/macro'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { type MetadataUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-maps.type'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { NavigationMenuItemExceptionCode } from 'src/engine/metadata-modules/navigation-menu-item/navigation-menu-item.exception'; import { validateFlatEntityCircularDependency } from 'src/engine/workspace-manager/workspace-migration/utils/validate-flat-entity-circular-dependency.util'; import { @@ -13,8 +13,8 @@ import { type FlatEntityValidationError, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { type FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { type UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; const NAVIGATION_MENU_ITEM_MAX_DEPTH = 2; @@ -99,19 +99,19 @@ export class FlatNavigationMenuItemValidatorService { } private getCircularDependencyValidationErrors({ - navigationMenuItemId, - folderId, + navigationMenuItemUniversalIdentifier, + folderUniversalIdentifier, flatNavigationMenuItemMaps, }: { - navigationMenuItemId: string; - folderId: string; - flatNavigationMenuItemMaps: MetadataFlatEntityMaps<'navigationMenuItem'>; + navigationMenuItemUniversalIdentifier: string; + folderUniversalIdentifier: string; + flatNavigationMenuItemMaps: MetadataUniversalFlatEntityMaps<'navigationMenuItem'>; }): FlatEntityValidationError[] { const circularDependencyResult = validateFlatEntityCircularDependency({ - flatEntityId: navigationMenuItemId, - flatEntityParentId: folderId, + flatEntityUniversalIdentifier: navigationMenuItemUniversalIdentifier, + flatEntityParentUniversalIdentifier: folderUniversalIdentifier, maxDepth: NAVIGATION_MENU_ITEM_MAX_DEPTH, - parentIdKey: 'folderId', + parentUniversalIdentifierKey: 'folderUniversalIdentifier', flatEntityMaps: flatNavigationMenuItemMaps, }); @@ -153,12 +153,11 @@ export class FlatNavigationMenuItemValidatorService { flatNavigationMenuItemMaps: optimisticFlatNavigationMenuItemMaps, }, remainingFlatEntityMapsToValidate, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.navigationMenuItem >): FailedFlatEntityValidation<'navigationMenuItem', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatNavigationMenuItem.id, universalIdentifier: flatNavigationMenuItem.universalIdentifier, }, metadataName: 'navigationMenuItem', @@ -180,20 +179,22 @@ export class FlatNavigationMenuItemValidatorService { const typeValidationErrors = this.validateNavigationMenuItemType({ hasTargetRecordId: isDefined(flatNavigationMenuItem.targetRecordId), hasTargetObjectMetadataId: isDefined( - flatNavigationMenuItem.targetObjectMetadataId, + flatNavigationMenuItem.targetObjectMetadataUniversalIdentifier, ), - hasViewId: isDefined(flatNavigationMenuItem.viewId), + hasViewId: isDefined(flatNavigationMenuItem.viewUniversalIdentifier), name: flatNavigationMenuItem.name, isUpdate: false, }); validationResult.errors.push(...typeValidationErrors); - if (isDefined(flatNavigationMenuItem.folderId)) { + if (isDefined(flatNavigationMenuItem.folderUniversalIdentifier)) { const circularDependencyErrors = this.getCircularDependencyValidationErrors({ - navigationMenuItemId: flatNavigationMenuItem.id, - folderId: flatNavigationMenuItem.folderId, + navigationMenuItemUniversalIdentifier: + flatNavigationMenuItem.universalIdentifier, + folderUniversalIdentifier: + flatNavigationMenuItem.folderUniversalIdentifier, flatNavigationMenuItemMaps: optimisticFlatNavigationMenuItemMaps, }); @@ -201,13 +202,13 @@ export class FlatNavigationMenuItemValidatorService { validationResult.errors.push(...circularDependencyErrors); } - const referencedParentInOptimistic = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatNavigationMenuItem.folderId, + const referencedParentInOptimistic = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatNavigationMenuItem.folderUniversalIdentifier, flatEntityMaps: optimisticFlatNavigationMenuItemMaps, }); - const referencedParentInRemaining = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatNavigationMenuItem.folderId, + const referencedParentInRemaining = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatNavigationMenuItem.folderUniversalIdentifier, flatEntityMaps: remainingFlatEntityMapsToValidate, }); @@ -231,20 +232,19 @@ export class FlatNavigationMenuItemValidatorService { optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatNavigationMenuItemMaps: optimisticFlatNavigationMenuItemMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.navigationMenuItem >): FailedFlatEntityValidation<'navigationMenuItem', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityToValidate.id, universalIdentifier: flatEntityToValidate.universalIdentifier, }, metadataName: 'navigationMenuItem', type: 'delete', }); - const existingNavigationMenuItem = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatEntityToValidate.id, + const existingNavigationMenuItem = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatEntityToValidate.universalIdentifier, flatEntityMaps: optimisticFlatNavigationMenuItemMaps, }); @@ -260,7 +260,7 @@ export class FlatNavigationMenuItemValidatorService { } public validateFlatNavigationMenuItemUpdate({ - flatEntityId, + universalIdentifier, flatEntityUpdate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatNavigationMenuItemMaps: optimisticFlatNavigationMenuItemMaps, @@ -268,15 +268,14 @@ export class FlatNavigationMenuItemValidatorService { }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.navigationMenuItem >): FailedFlatEntityValidation<'navigationMenuItem', 'update'> { - const fromFlatNavigationMenuItem = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const fromFlatNavigationMenuItem = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatNavigationMenuItemMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: fromFlatNavigationMenuItem?.universalIdentifier, + universalIdentifier, }, metadataName: 'navigationMenuItem', type: 'update', @@ -315,27 +314,29 @@ export class FlatNavigationMenuItemValidatorService { const typeValidationErrors = this.validateNavigationMenuItemType({ hasTargetRecordId: isDefined(toFlatNavigationMenuItem.targetRecordId), hasTargetObjectMetadataId: isDefined( - toFlatNavigationMenuItem.targetObjectMetadataId, + toFlatNavigationMenuItem.targetObjectMetadataUniversalIdentifier, ), - hasViewId: isDefined(toFlatNavigationMenuItem.viewId), + hasViewId: isDefined(toFlatNavigationMenuItem.viewUniversalIdentifier), name: isDefined(nameUpdate) ? nameUpdate : toFlatNavigationMenuItem.name, isUpdate: true, }); validationResult.errors.push(...typeValidationErrors); - const folderIdUpdate = flatEntityUpdate.folderId; + const folderUniversalIdentifierUpdate = + flatEntityUpdate.folderUniversalIdentifier; - if (!isDefined(folderIdUpdate)) { + if (!isDefined(folderUniversalIdentifierUpdate)) { return validationResult; } - const newFolderId = folderIdUpdate; + const newFolderUniversalIdentifier = folderUniversalIdentifierUpdate; const circularDependencyErrors = this.getCircularDependencyValidationErrors( { - navigationMenuItemId: flatEntityId, - folderId: newFolderId, + navigationMenuItemUniversalIdentifier: + fromFlatNavigationMenuItem.universalIdentifier, + folderUniversalIdentifier: newFolderUniversalIdentifier, flatNavigationMenuItemMaps: optimisticFlatNavigationMenuItemMaps, }, ); @@ -345,8 +346,8 @@ export class FlatNavigationMenuItemValidatorService { } const referencedParentNavigationMenuItem = - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: newFolderId, + findFlatEntityByUniversalIdentifier({ + universalIdentifier: newFolderUniversalIdentifier, flatEntityMaps: optimisticFlatNavigationMenuItemMaps, }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-object-metadata-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-object-metadata-validator.service.ts index 9198bac1be..93343405c8 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-object-metadata-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-object-metadata-validator.service.ts @@ -4,20 +4,20 @@ import { msg, t } from '@lingui/core/macro'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { validateFlatObjectMetadataIdentifiers } from 'src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-identifiers.util'; import { validateFlatObjectMetadataNameAndLabels } from 'src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-name-and-labels.util'; import { ObjectMetadataExceptionCode } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util'; import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; @Injectable() export class FlatObjectMetadataValidatorService { public validateFlatObjectMetadataUpdate({ - flatEntityId, + universalIdentifier, flatEntityUpdate, buildOptions, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { @@ -27,15 +27,14 @@ export class FlatObjectMetadataValidatorService { }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.objectMetadata >): FailedFlatEntityValidation<'objectMetadata', 'update'> { - const existingFlatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const existingFlatObjectMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatObjectMetadataMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: existingFlatObjectMetadata?.universalIdentifier, + universalIdentifier, }, metadataName: 'objectMetadata', type: 'update', @@ -58,21 +57,27 @@ export class FlatObjectMetadataValidatorService { validationResult.flatEntityMinimalInformation = { ...validationResult.flatEntityMinimalInformation, - id: existingFlatObjectMetadata.id, namePlural: existingFlatObjectMetadata.namePlural, nameSingular: existingFlatObjectMetadata.nameSingular, }; validationResult.errors.push( ...validateFlatObjectMetadataNameAndLabels({ - optimisticFlatObjectMetadataMaps, - flatObjectMetadataToValidate: updatedFlatObjectMetadata, + optimisticUniversalFlatObjectMetadataMaps: + optimisticFlatObjectMetadataMaps, + universalFlatObjectMetadataToValidate: updatedFlatObjectMetadata, buildOptions, }), ); // TODO remove this once we migrated labelIdentifierFieldMetadataId as non nullable - if (flatEntityUpdate.labelIdentifierFieldMetadataId !== undefined) { - if (flatEntityUpdate.labelIdentifierFieldMetadataId === null) { + if ( + flatEntityUpdate.labelIdentifierFieldMetadataUniversalIdentifier !== + undefined + ) { + if ( + flatEntityUpdate.labelIdentifierFieldMetadataUniversalIdentifier === + null + ) { validationResult.errors.push({ code: ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT, message: 'labelIdentifierFieldMetadataId cannot be null', @@ -82,8 +87,8 @@ export class FlatObjectMetadataValidatorService { validationResult.errors.push( ...validateFlatObjectMetadataIdentifiers({ - flatObjectMetadata: updatedFlatObjectMetadata, - flatFieldMetadataMaps, + universalFlatObjectMetadata: updatedFlatObjectMetadata, + universalFlatFieldMetadataMaps: flatFieldMetadataMaps, }), ); } @@ -92,28 +97,27 @@ export class FlatObjectMetadataValidatorService { } public validateFlatObjectMetadataDeletion({ - flatEntityToValidate: { id: objectMetadataToDeleteId, universalIdentifier }, + flatEntityToValidate: { universalIdentifier }, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatObjectMetadataMaps: optimisticFlatObjectMetadataMaps, }, buildOptions, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.objectMetadata >): FailedFlatEntityValidation<'objectMetadata', 'delete'> { + const flatObjectMetadataToDelete = findFlatEntityByUniversalIdentifier({ + universalIdentifier, + flatEntityMaps: optimisticFlatObjectMetadataMaps, + }); + const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: objectMetadataToDeleteId, universalIdentifier, }, metadataName: 'objectMetadata', type: 'delete', }); - const flatObjectMetadataToDelete = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: objectMetadataToDeleteId, - flatEntityMaps: optimisticFlatObjectMetadataMaps, - }); - if (!isDefined(flatObjectMetadataToDelete)) { validationResult.errors.push({ code: ObjectMetadataExceptionCode.OBJECT_METADATA_NOT_FOUND, @@ -153,16 +157,15 @@ export class FlatObjectMetadataValidatorService { public validateFlatObjectMetadataCreation({ flatEntityToValidate: flatObjectMetadataToValidate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { - flatObjectMetadataMaps: optimisticFlatObjectMetadataMaps, + flatObjectMetadataMaps: optimisticUniversalFlatObjectMetadataMaps, flatFieldMetadataMaps, }, buildOptions, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.objectMetadata >): FailedFlatEntityValidation<'objectMetadata', 'create'> { const objectValidationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatObjectMetadataToValidate.id, universalIdentifier: flatObjectMetadataToValidate.universalIdentifier, namePlural: flatObjectMetadataToValidate.namePlural, nameSingular: flatObjectMetadataToValidate.nameSingular, @@ -173,16 +176,16 @@ export class FlatObjectMetadataValidatorService { if ( isDefined( - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatObjectMetadataToValidate.id, - flatEntityMaps: optimisticFlatObjectMetadataMaps, + findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatObjectMetadataToValidate.universalIdentifier, + flatEntityMaps: optimisticUniversalFlatObjectMetadataMaps, }), ) ) { objectValidationResult.errors.push({ code: ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT, - message: t`Object with same id already exists`, - userFriendlyMessage: msg`Object with same id already exists`, + message: t`Object with same universal identifier already exists`, + userFriendlyMessage: msg`Object with same universal identifier already exists`, }); } @@ -196,14 +199,14 @@ export class FlatObjectMetadataValidatorService { objectValidationResult.errors.push( ...validateFlatObjectMetadataIdentifiers({ - flatObjectMetadata: flatObjectMetadataToValidate, - flatFieldMetadataMaps, + universalFlatObjectMetadata: flatObjectMetadataToValidate, + universalFlatFieldMetadataMaps: flatFieldMetadataMaps, }), ); objectValidationResult.errors.push( ...validateFlatObjectMetadataNameAndLabels({ - optimisticFlatObjectMetadataMaps, - flatObjectMetadataToValidate, + optimisticUniversalFlatObjectMetadataMaps, + universalFlatObjectMetadataToValidate: flatObjectMetadataToValidate, buildOptions, }), ); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-page-layout-tab-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-page-layout-tab-validator.service.ts index 6da1626673..4e636d1c96 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-page-layout-tab-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-page-layout-tab-validator.service.ts @@ -4,12 +4,12 @@ import { msg, t } from '@lingui/core/macro'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { PageLayoutExceptionCode } from 'src/engine/metadata-modules/page-layout/exceptions/page-layout.exception'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; const PAGE_LAYOUT_TAB_EXCEPTION_CODE = { PAGE_LAYOUT_TAB_NOT_FOUND: 'PAGE_LAYOUT_TAB_NOT_FOUND', @@ -20,12 +20,11 @@ export class FlatPageLayoutTabValidatorService { public validateFlatPageLayoutTabCreation({ flatEntityToValidate: flatPageLayoutTab, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatPageLayoutMaps }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.pageLayoutTab >): FailedFlatEntityValidation<'pageLayoutTab', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatPageLayoutTab.id, universalIdentifier: flatPageLayoutTab.universalIdentifier, title: flatPageLayoutTab.title, }, @@ -33,8 +32,8 @@ export class FlatPageLayoutTabValidatorService { type: 'create', }); - const referencedPageLayout = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatPageLayoutTab.pageLayoutId, + const referencedPageLayout = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatPageLayoutTab.pageLayoutUniversalIdentifier, flatEntityMaps: flatPageLayoutMaps, }); @@ -54,12 +53,11 @@ export class FlatPageLayoutTabValidatorService { optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatPageLayoutTabMaps: optimisticFlatPageLayoutTabMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.pageLayoutTab >): FailedFlatEntityValidation<'pageLayoutTab', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityToValidate.id, universalIdentifier: flatEntityToValidate.universalIdentifier, title: flatEntityToValidate.title, }, @@ -67,8 +65,8 @@ export class FlatPageLayoutTabValidatorService { type: 'delete', }); - const existingPageLayoutTab = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatEntityToValidate.id, + const existingPageLayoutTab = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatEntityToValidate.universalIdentifier, flatEntityMaps: optimisticFlatPageLayoutTabMaps, }); @@ -86,22 +84,21 @@ export class FlatPageLayoutTabValidatorService { } public validateFlatPageLayoutTabUpdate({ - flatEntityId, + universalIdentifier, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatPageLayoutTabMaps: optimisticFlatPageLayoutTabMaps, }, }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.pageLayoutTab >): FailedFlatEntityValidation<'pageLayoutTab', 'update'> { - const fromFlatPageLayoutTab = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const fromFlatPageLayoutTab = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatPageLayoutTabMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: fromFlatPageLayoutTab?.universalIdentifier, + universalIdentifier, }, metadataName: 'pageLayoutTab', type: 'update', diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-page-layout-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-page-layout-validator.service.ts index 3ba32cb9cd..f48750b42c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-page-layout-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-page-layout-validator.service.ts @@ -4,11 +4,11 @@ import { msg, t } from '@lingui/core/macro'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { type FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { type UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; const PAGE_LAYOUT_EXCEPTION_CODE = { PAGE_LAYOUT_NOT_FOUND: 'PAGE_LAYOUT_NOT_FOUND', @@ -18,12 +18,11 @@ const PAGE_LAYOUT_EXCEPTION_CODE = { export class FlatPageLayoutValidatorService { public validateFlatPageLayoutCreation({ flatEntityToValidate: flatPageLayout, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.pageLayout >): FailedFlatEntityValidation<'pageLayout', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatPageLayout.id, universalIdentifier: flatPageLayout.universalIdentifier, name: flatPageLayout.name, }, @@ -39,12 +38,11 @@ export class FlatPageLayoutValidatorService { optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatPageLayoutMaps: optimisticFlatPageLayoutMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.pageLayout >): FailedFlatEntityValidation<'pageLayout', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityToValidate.id, universalIdentifier: flatEntityToValidate.universalIdentifier, name: flatEntityToValidate.name, }, @@ -52,8 +50,8 @@ export class FlatPageLayoutValidatorService { type: 'delete', }); - const existingPageLayout = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatEntityToValidate.id, + const existingPageLayout = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatEntityToValidate.universalIdentifier, flatEntityMaps: optimisticFlatPageLayoutMaps, }); @@ -71,22 +69,21 @@ export class FlatPageLayoutValidatorService { } public validateFlatPageLayoutUpdate({ - flatEntityId, + universalIdentifier, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatPageLayoutMaps: optimisticFlatPageLayoutMaps, }, }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.pageLayout >): FailedFlatEntityValidation<'pageLayout', 'update'> { - const fromFlatPageLayout = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const fromFlatPageLayout = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatPageLayoutMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: fromFlatPageLayout?.universalIdentifier, + universalIdentifier, }, metadataName: 'pageLayout', type: 'update', diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-page-layout-widget-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-page-layout-widget-validator.service.ts index 5f05ce027d..5c5d796dca 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-page-layout-widget-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-page-layout-widget-validator.service.ts @@ -9,7 +9,7 @@ import { import { isDefined } from 'twenty-shared/utils'; import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { type FlatPageLayoutTab } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab.type'; import { FlatPageLayoutWidgetTypeValidatorService } from 'src/engine/metadata-modules/flat-page-layout-widget/services/flat-page-layout-widget-type-validator.service'; import { PageLayoutTabExceptionCode } from 'src/engine/metadata-modules/page-layout-tab/exceptions/page-layout-tab.exception'; @@ -26,8 +26,8 @@ import { FlatEntityValidationError, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; @Injectable() export class FlatPageLayoutWidgetValidatorService { @@ -36,7 +36,7 @@ export class FlatPageLayoutWidgetValidatorService { ) {} public async validateFlatPageLayoutWidgetUpdate({ - flatEntityId, + universalIdentifier, flatEntityUpdate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps, additionalCacheDataMaps: { featureFlagsMap }, @@ -48,16 +48,15 @@ export class FlatPageLayoutWidgetValidatorService { const isDashboardV2Enabled = featureFlagsMap[FeatureFlagKey.IS_DASHBOARD_V2_ENABLED] ?? false; - const existingFlatPageLayoutWidget = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatEntityId, + const existingFlatPageLayoutWidget = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatPageLayoutWidgetMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: existingFlatPageLayoutWidget?.universalIdentifier, + universalIdentifier, }, metadataName: 'pageLayoutWidget', type: 'update', @@ -80,12 +79,13 @@ export class FlatPageLayoutWidgetValidatorService { validationResult.flatEntityMinimalInformation = { ...validationResult.flatEntityMinimalInformation, - id: updatedFlatPageLayoutWidget.id, - pageLayoutTabId: updatedFlatPageLayoutWidget.pageLayoutTabId, + pageLayoutTabUniversalIdentifier: + updatedFlatPageLayoutWidget.pageLayoutTabUniversalIdentifier, }; - const referencedPageLayoutTab = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: updatedFlatPageLayoutWidget.pageLayoutTabId, + const referencedPageLayoutTab = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + updatedFlatPageLayoutWidget.pageLayoutTabUniversalIdentifier, flatEntityMaps: optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatPageLayoutTabMaps, }); @@ -134,27 +134,23 @@ export class FlatPageLayoutWidgetValidatorService { } public validateFlatPageLayoutWidgetDeletion({ - flatEntityToValidate: { - id: pageLayoutWidgetIdToDelete, - universalIdentifier, - }, + flatEntityToValidate: { universalIdentifier }, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatPageLayoutWidgetMaps: optimisticFlatPageLayoutWidgetMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.pageLayoutWidget >): FailedFlatEntityValidation<'pageLayoutWidget', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: pageLayoutWidgetIdToDelete, universalIdentifier, }, metadataName: 'pageLayoutWidget', type: 'delete', }); - const existingFlatPageLayoutWidget = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: pageLayoutWidgetIdToDelete, + const existingFlatPageLayoutWidget = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatPageLayoutWidgetMaps, }); @@ -178,7 +174,7 @@ export class FlatPageLayoutWidgetValidatorService { workspaceId, buildOptions, remainingFlatEntityMapsToValidate, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.pageLayoutWidget >): Promise> { const isDashboardV2Enabled = @@ -186,32 +182,34 @@ export class FlatPageLayoutWidgetValidatorService { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatPageLayoutWidgetToValidate.id, universalIdentifier: flatPageLayoutWidgetToValidate.universalIdentifier, - pageLayoutTabId: flatPageLayoutWidgetToValidate.pageLayoutTabId, + pageLayoutTabUniversalIdentifier: + flatPageLayoutWidgetToValidate.pageLayoutTabUniversalIdentifier, }, metadataName: 'pageLayoutWidget', type: 'create', }); - const existingFlatPageLayoutWidget = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatPageLayoutWidgetToValidate.id, + const existingFlatPageLayoutWidget = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatPageLayoutWidgetToValidate.universalIdentifier, flatEntityMaps: optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatPageLayoutWidgetMaps, }); if (isDefined(existingFlatPageLayoutWidget)) { - const flatPageLayoutWidgetId = flatPageLayoutWidgetToValidate.id; + const flatPageLayoutWidgetUniversalIdentifier = + flatPageLayoutWidgetToValidate.universalIdentifier; validationResult.errors.push({ code: PageLayoutWidgetExceptionCode.INVALID_PAGE_LAYOUT_WIDGET_DATA, - message: t`Page layout widget with id ${flatPageLayoutWidgetId} already exists`, + message: t`Page layout widget with universal identifier ${flatPageLayoutWidgetUniversalIdentifier} already exists`, userFriendlyMessage: msg`Page layout widget already exists`, }); } - const referencedPageLayoutTab = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatPageLayoutWidgetToValidate.pageLayoutTabId, + const referencedPageLayoutTab = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatPageLayoutWidgetToValidate.pageLayoutTabUniversalIdentifier, flatEntityMaps: optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatPageLayoutTabMaps, }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-role-target-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-role-target-validator.service.ts index 2494384d3a..abdbbb974c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-role-target-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-role-target-validator.service.ts @@ -4,12 +4,12 @@ import { msg, t } from '@lingui/core/macro'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { RoleTargetExceptionCode } from 'src/engine/metadata-modules/role/exceptions/role-target.exception'; import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; import { validateFlatRoleTargetAssignationAvailability } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-flat-role-target-assignation-availability.util'; import { validateFlatRoleTargetTargetsOnlyOneEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-flat-role-target-targets-only-one-entity.util'; @@ -21,28 +21,27 @@ export class FlatRoleTargetValidatorService { flatRoleTargetMaps: optimisticFlatRoleTargetMaps, flatRoleMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.roleTarget >): FailedFlatEntityValidation<'roleTarget', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatRoleTargetToValidate.id, universalIdentifier: flatRoleTargetToValidate.universalIdentifier, }, metadataName: 'roleTarget', type: 'create', }); - const existingRoleTarget = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatRoleTargetToValidate.id, + const existingRoleTarget = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatRoleTargetToValidate.universalIdentifier, flatEntityMaps: optimisticFlatRoleTargetMaps, }); if (isDefined(existingRoleTarget)) { validationResult.errors.push({ code: RoleTargetExceptionCode.INVALID_ROLE_TARGET_DATA, - message: t`Role target with this id already exists`, - userFriendlyMessage: msg`Role target with this id already exists`, + message: t`Role target with this universal identifier already exists`, + userFriendlyMessage: msg`Role target already exists`, }); } @@ -52,8 +51,8 @@ export class FlatRoleTargetValidatorService { }), ); - const referencedRole = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatRoleTargetToValidate.roleId, + const referencedRole = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatRoleTargetToValidate.roleUniversalIdentifier, flatEntityMaps: flatRoleMaps, }); @@ -80,20 +79,19 @@ export class FlatRoleTargetValidatorService { optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatRoleTargetMaps: optimisticFlatRoleTargetMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.roleTarget >): FailedFlatEntityValidation<'roleTarget', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatRoleTargetToValidate.id, universalIdentifier: flatRoleTargetToValidate.universalIdentifier, }, metadataName: 'roleTarget', type: 'delete', }); - const existingRoleTarget = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatRoleTargetToValidate.id, + const existingRoleTarget = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatRoleTargetToValidate.universalIdentifier, flatEntityMaps: optimisticFlatRoleTargetMaps, }); @@ -111,7 +109,7 @@ export class FlatRoleTargetValidatorService { } validateFlatRoleTargetUpdate({ - flatEntityId, + universalIdentifier, flatEntityUpdate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatRoleTargetMaps: optimisticFlatRoleTargetMaps, @@ -120,15 +118,14 @@ export class FlatRoleTargetValidatorService { }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.roleTarget >): FailedFlatEntityValidation<'roleTarget', 'update'> { - const existingRoleTarget = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const existingRoleTarget = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatRoleTargetMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: existingRoleTarget?.universalIdentifier, + universalIdentifier, }, metadataName: 'roleTarget', type: 'update', @@ -155,8 +152,8 @@ export class FlatRoleTargetValidatorService { }), ); - const referencedRole = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: updatedFlatRoleTarget.roleId, + const referencedRole = findFlatEntityByUniversalIdentifier({ + universalIdentifier: updatedFlatRoleTarget.roleUniversalIdentifier, flatEntityMaps: flatRoleMaps, }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-role-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-role-validator.service.ts index 9df9878c20..f9375108b5 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-role-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-role-validator.service.ts @@ -4,12 +4,12 @@ import { msg, t } from '@lingui/core/macro'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { PermissionsExceptionCode } from 'src/engine/metadata-modules/permissions/permissions.exception'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { type FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { type UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; import { validateRoleIsEditable } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-role-is-editable.util'; import { validateRoleLabelUniqueness } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-role-label-uniqueness.util'; import { validateRoleReadWritePermissionsConsistency } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-role-read-write-permissions-consistency.util'; @@ -22,12 +22,11 @@ export class FlatRoleValidatorService { optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatRoleMaps: optimisticFlatRoleMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.role >): FailedFlatEntityValidation<'role', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityToValidate.id, universalIdentifier: flatEntityToValidate.universalIdentifier, label: flatEntityToValidate.label, }, @@ -67,12 +66,11 @@ export class FlatRoleValidatorService { flatRoleMaps: optimisticFlatRoleMaps, }, buildOptions, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.role >): FailedFlatEntityValidation<'role', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityToValidate.id, universalIdentifier: flatEntityToValidate.universalIdentifier, label: flatEntityToValidate.label, }, @@ -80,8 +78,8 @@ export class FlatRoleValidatorService { type: 'delete', }); - const existingRole = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatEntityToValidate.id, + const existingRole = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatEntityToValidate.universalIdentifier, flatEntityMaps: optimisticFlatRoleMaps, }); @@ -106,7 +104,7 @@ export class FlatRoleValidatorService { } public validateFlatRoleUpdate({ - flatEntityId, + universalIdentifier, flatEntityUpdate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatRoleMaps: optimisticFlatRoleMaps, @@ -115,15 +113,14 @@ export class FlatRoleValidatorService { }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.role >): FailedFlatEntityValidation<'role', 'update'> { - const fromFlatRole = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const fromFlatRole = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatRoleMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: fromFlatRole?.universalIdentifier, + universalIdentifier, }, metadataName: 'role', type: 'update', diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-row-level-permission-predicate-group-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-row-level-permission-predicate-group-validator.service.ts index d068e71d39..44a63f0189 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-row-level-permission-predicate-group-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-row-level-permission-predicate-group-validator.service.ts @@ -6,19 +6,19 @@ import { msg, t } from '@lingui/core/macro'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { RowLevelPermissionPredicateGroupExceptionCode } from 'src/engine/metadata-modules/row-level-permission-predicate/exceptions/row-level-permission-predicate-group.exception'; import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; @Injectable() export class FlatRowLevelPermissionPredicateGroupValidatorService { validateFlatRowLevelPermissionPredicateGroupCreation({ flatEntityToValidate: flatPredicateGroupToValidate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.rowLevelPermissionPredicateGroup >): FailedFlatEntityValidation<'rowLevelPermissionPredicateGroup', 'create'> { const { @@ -29,34 +29,33 @@ export class FlatRowLevelPermissionPredicateGroupValidatorService { } = optimisticFlatEntityMapsAndRelatedFlatEntityMaps; const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatPredicateGroupToValidate.id, universalIdentifier: flatPredicateGroupToValidate.universalIdentifier, }, metadataName: 'rowLevelPermissionPredicateGroup', type: 'create', }); - const existingPredicateGroup = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatPredicateGroupToValidate.id, + const existingPredicateGroup = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatPredicateGroupToValidate.universalIdentifier, flatEntityMaps: optimisticFlatPredicateGroupMaps, }); if (isDefined(existingPredicateGroup)) { validationResult.errors.push({ code: RowLevelPermissionPredicateGroupExceptionCode.INVALID_ROW_LEVEL_PERMISSION_PREDICATE_GROUP_DATA, - message: t`Row level permission predicate group with this id already exists`, - userFriendlyMessage: msg`Row level permission predicate group with this id already exists`, + message: t`Row level permission predicate group with this universal identifier already exists`, + userFriendlyMessage: msg`Row level permission predicate group already exists`, }); } if ( isDefined( - flatPredicateGroupToValidate.parentRowLevelPermissionPredicateGroupId, + flatPredicateGroupToValidate.parentRowLevelPermissionPredicateGroupUniversalIdentifier, ) ) { - const parentGroup = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: - flatPredicateGroupToValidate.parentRowLevelPermissionPredicateGroupId, + const parentGroup = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatPredicateGroupToValidate.parentRowLevelPermissionPredicateGroupUniversalIdentifier, flatEntityMaps: optimisticFlatPredicateGroupMaps, }); @@ -70,8 +69,9 @@ export class FlatRowLevelPermissionPredicateGroupValidatorService { } const role = flatRoleMaps - ? findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatPredicateGroupToValidate.roleId, + ? findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatPredicateGroupToValidate.roleUniversalIdentifier, flatEntityMaps: flatRoleMaps, }) : undefined; @@ -85,8 +85,9 @@ export class FlatRowLevelPermissionPredicateGroupValidatorService { } const objectMetadata = flatObjectMetadataMaps - ? findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatPredicateGroupToValidate.objectMetadataId, + ? findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatPredicateGroupToValidate.objectMetadataUniversalIdentifier, flatEntityMaps: flatObjectMetadataMaps, }) : undefined; @@ -105,7 +106,7 @@ export class FlatRowLevelPermissionPredicateGroupValidatorService { validateFlatRowLevelPermissionPredicateGroupDeletion({ flatEntityToValidate: flatPredicateGroupToDelete, optimisticFlatEntityMapsAndRelatedFlatEntityMaps, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.rowLevelPermissionPredicateGroup >): FailedFlatEntityValidation<'rowLevelPermissionPredicateGroup', 'delete'> { const { @@ -115,15 +116,14 @@ export class FlatRowLevelPermissionPredicateGroupValidatorService { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatPredicateGroupToDelete.id, universalIdentifier: flatPredicateGroupToDelete.universalIdentifier, }, metadataName: 'rowLevelPermissionPredicateGroup', type: 'delete', }); - const existingPredicateGroup = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatPredicateGroupToDelete.id, + const existingPredicateGroup = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatPredicateGroupToDelete.universalIdentifier, flatEntityMaps: optimisticFlatPredicateGroupMaps, }); @@ -139,7 +139,7 @@ export class FlatRowLevelPermissionPredicateGroupValidatorService { } validateFlatRowLevelPermissionPredicateGroupUpdate({ - flatEntityId, + universalIdentifier, flatEntityUpdate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps, }: FlatEntityUpdateValidationArgs< @@ -152,15 +152,14 @@ export class FlatRowLevelPermissionPredicateGroupValidatorService { flatObjectMetadataMaps, } = optimisticFlatEntityMapsAndRelatedFlatEntityMaps; - const existingPredicateGroup = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const existingPredicateGroup = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatPredicateGroupMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: existingPredicateGroup?.universalIdentifier, + universalIdentifier, }, metadataName: 'rowLevelPermissionPredicateGroup', type: 'update', @@ -207,11 +206,13 @@ export class FlatRowLevelPermissionPredicateGroupValidatorService { } if ( - isDefined(updatedPredicateGroup.parentRowLevelPermissionPredicateGroupId) + isDefined( + updatedPredicateGroup.parentRowLevelPermissionPredicateGroupUniversalIdentifier, + ) ) { - const parentGroup = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: - updatedPredicateGroup.parentRowLevelPermissionPredicateGroupId, + const parentGroup = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + updatedPredicateGroup.parentRowLevelPermissionPredicateGroupUniversalIdentifier, flatEntityMaps: optimisticFlatPredicateGroupMaps, }); @@ -225,8 +226,8 @@ export class FlatRowLevelPermissionPredicateGroupValidatorService { } const role = flatRoleMaps - ? findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: updatedPredicateGroup.roleId, + ? findFlatEntityByUniversalIdentifier({ + universalIdentifier: updatedPredicateGroup.roleUniversalIdentifier, flatEntityMaps: flatRoleMaps, }) : undefined; @@ -240,8 +241,9 @@ export class FlatRowLevelPermissionPredicateGroupValidatorService { } const objectMetadata = flatObjectMetadataMaps - ? findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: updatedPredicateGroup.objectMetadataId, + ? findFlatEntityByUniversalIdentifier({ + universalIdentifier: + updatedPredicateGroup.objectMetadataUniversalIdentifier, flatEntityMaps: flatObjectMetadataMaps, }) : undefined; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-row-level-permission-predicate-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-row-level-permission-predicate-validator.service.ts index b0ed8267ae..db880c9176 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-row-level-permission-predicate-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-row-level-permission-predicate-validator.service.ts @@ -6,19 +6,19 @@ import { msg, t } from '@lingui/core/macro'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { RowLevelPermissionPredicateExceptionCode } from 'src/engine/metadata-modules/row-level-permission-predicate/exceptions/row-level-permission-predicate.exception'; import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; @Injectable() export class FlatRowLevelPermissionPredicateValidatorService { validateFlatRowLevelPermissionPredicateCreation({ flatEntityToValidate: flatPredicateToValidate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.rowLevelPermissionPredicate >): FailedFlatEntityValidation<'rowLevelPermissionPredicate', 'create'> { const { @@ -31,29 +31,29 @@ export class FlatRowLevelPermissionPredicateValidatorService { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatPredicateToValidate.id, universalIdentifier: flatPredicateToValidate.universalIdentifier, }, metadataName: 'rowLevelPermissionPredicate', type: 'create', }); - const existingPredicate = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatPredicateToValidate.id, + const existingPredicate = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatPredicateToValidate.universalIdentifier, flatEntityMaps: optimisticFlatPredicateMaps, }); if (isDefined(existingPredicate)) { validationResult.errors.push({ code: RowLevelPermissionPredicateExceptionCode.INVALID_ROW_LEVEL_PERMISSION_PREDICATE_DATA, - message: t`Row level permission predicate with this id already exists`, - userFriendlyMessage: msg`Row level permission predicate with this id already exists`, + message: t`Row level permission predicate with this universal identifier already exists`, + userFriendlyMessage: msg`Row level permission predicate already exists`, }); } const fieldMetadata = flatFieldMetadataMaps - ? findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatPredicateToValidate.fieldMetadataId, + ? findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatPredicateToValidate.fieldMetadataUniversalIdentifier, flatEntityMaps: flatFieldMetadataMaps, }) : undefined; @@ -67,8 +67,9 @@ export class FlatRowLevelPermissionPredicateValidatorService { } const objectMetadata = flatObjectMetadataMaps - ? findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatPredicateToValidate.objectMetadataId, + ? findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatPredicateToValidate.objectMetadataUniversalIdentifier, flatEntityMaps: flatObjectMetadataMaps, }) : undefined; @@ -82,12 +83,14 @@ export class FlatRowLevelPermissionPredicateValidatorService { } if ( - isDefined(flatPredicateToValidate.rowLevelPermissionPredicateGroupId) && + isDefined( + flatPredicateToValidate.rowLevelPermissionPredicateGroupUniversalIdentifier, + ) && flatRowLevelPermissionPredicateGroupMaps ) { - const predicateGroup = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: - flatPredicateToValidate.rowLevelPermissionPredicateGroupId, + const predicateGroup = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatPredicateToValidate.rowLevelPermissionPredicateGroupUniversalIdentifier, flatEntityMaps: flatRowLevelPermissionPredicateGroupMaps, }); @@ -101,8 +104,8 @@ export class FlatRowLevelPermissionPredicateValidatorService { } const role = flatRoleMaps - ? findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatPredicateToValidate.roleId, + ? findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatPredicateToValidate.roleUniversalIdentifier, flatEntityMaps: flatRoleMaps, }) : undefined; @@ -121,22 +124,21 @@ export class FlatRowLevelPermissionPredicateValidatorService { validateFlatRowLevelPermissionPredicateDeletion({ flatEntityToValidate: flatPredicateToDelete, optimisticFlatEntityMapsAndRelatedFlatEntityMaps, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.rowLevelPermissionPredicate >): FailedFlatEntityValidation<'rowLevelPermissionPredicate', 'delete'> { const { flatRowLevelPermissionPredicateMaps: optimisticFlatPredicateMaps } = optimisticFlatEntityMapsAndRelatedFlatEntityMaps; const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatPredicateToDelete.id, universalIdentifier: flatPredicateToDelete.universalIdentifier, }, metadataName: 'rowLevelPermissionPredicate', type: 'delete', }); - const existingPredicate = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatPredicateToDelete.id, + const existingPredicate = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatPredicateToDelete.universalIdentifier, flatEntityMaps: optimisticFlatPredicateMaps, }); @@ -152,7 +154,7 @@ export class FlatRowLevelPermissionPredicateValidatorService { } validateFlatRowLevelPermissionPredicateUpdate({ - flatEntityId, + universalIdentifier, flatEntityUpdate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps, }: FlatEntityUpdateValidationArgs< @@ -166,15 +168,14 @@ export class FlatRowLevelPermissionPredicateValidatorService { flatRoleMaps, } = optimisticFlatEntityMapsAndRelatedFlatEntityMaps; - const existingPredicate = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const existingPredicate = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatPredicateMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: existingPredicate?.universalIdentifier, + universalIdentifier, }, metadataName: 'rowLevelPermissionPredicate', type: 'update', @@ -220,8 +221,9 @@ export class FlatRowLevelPermissionPredicateValidatorService { } const fieldMetadata = flatFieldMetadataMaps - ? findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: updatedPredicate.fieldMetadataId, + ? findFlatEntityByUniversalIdentifier({ + universalIdentifier: + updatedPredicate.fieldMetadataUniversalIdentifier, flatEntityMaps: flatFieldMetadataMaps, }) : undefined; @@ -235,8 +237,9 @@ export class FlatRowLevelPermissionPredicateValidatorService { } const objectMetadata = flatObjectMetadataMaps - ? findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: updatedPredicate.objectMetadataId, + ? findFlatEntityByUniversalIdentifier({ + universalIdentifier: + updatedPredicate.objectMetadataUniversalIdentifier, flatEntityMaps: flatObjectMetadataMaps, }) : undefined; @@ -250,11 +253,14 @@ export class FlatRowLevelPermissionPredicateValidatorService { } if ( - isDefined(updatedPredicate.rowLevelPermissionPredicateGroupId) && + isDefined( + updatedPredicate.rowLevelPermissionPredicateGroupUniversalIdentifier, + ) && flatRowLevelPermissionPredicateGroupMaps ) { - const predicateGroup = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: updatedPredicate.rowLevelPermissionPredicateGroupId, + const predicateGroup = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + updatedPredicate.rowLevelPermissionPredicateGroupUniversalIdentifier, flatEntityMaps: flatRowLevelPermissionPredicateGroupMaps, }); @@ -268,8 +274,8 @@ export class FlatRowLevelPermissionPredicateValidatorService { } const role = flatRoleMaps - ? findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: updatedPredicate.roleId, + ? findFlatEntityByUniversalIdentifier({ + universalIdentifier: updatedPredicate.roleUniversalIdentifier, flatEntityMaps: flatRoleMaps, }) : undefined; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-skill-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-skill-validator.service.ts index 84d0bb2e1b..a53ab74f2b 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-skill-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-skill-validator.service.ts @@ -4,14 +4,14 @@ import { msg, t } from '@lingui/core/macro'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { type FlatSkill } from 'src/engine/metadata-modules/flat-skill/types/flat-skill.type'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { SkillExceptionCode } from 'src/engine/metadata-modules/skill/skill.exception'; +import { type UniversalFlatSkill } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-skill.type'; import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { type FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { type UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; import { validateSkillNameUniqueness } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-skill-name-uniqueness.util'; import { validateSkillContentIsDefined, @@ -26,12 +26,11 @@ export class FlatSkillValidatorService { optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatSkillMaps: optimisticFlatSkillMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.skill >): FailedFlatEntityValidation<'skill', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatSkill.id, universalIdentifier: flatSkill.universalIdentifier, name: flatSkill.name, }, @@ -63,12 +62,11 @@ export class FlatSkillValidatorService { flatSkillMaps: optimisticFlatSkillMaps, }, buildOptions, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.skill >): FailedFlatEntityValidation<'skill', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityToValidate.id, universalIdentifier: flatEntityToValidate.universalIdentifier, name: flatEntityToValidate.name, }, @@ -76,8 +74,8 @@ export class FlatSkillValidatorService { type: 'delete', }); - const existingSkill = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatEntityToValidate.id, + const existingSkill = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatEntityToValidate.universalIdentifier, flatEntityMaps: optimisticFlatSkillMaps, }); @@ -110,7 +108,7 @@ export class FlatSkillValidatorService { } public validateFlatSkillUpdate({ - flatEntityId, + universalIdentifier, flatEntityUpdate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatSkillMaps: optimisticFlatSkillMaps, @@ -119,15 +117,14 @@ export class FlatSkillValidatorService { }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.skill >): FailedFlatEntityValidation<'skill', 'update'> { - const fromFlatSkill = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const fromFlatSkill = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatSkillMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: fromFlatSkill?.universalIdentifier, + universalIdentifier, }, metadataName: 'skill', type: 'update', @@ -176,7 +173,7 @@ export class FlatSkillValidatorService { return validationResult; } - const optimisticFlatSkill: FlatSkill = { + const optimisticFlatSkill: UniversalFlatSkill = { ...fromFlatSkill, ...flatEntityUpdate, }; @@ -204,7 +201,7 @@ export class FlatSkillValidatorService { optimisticFlatSkillMaps.byUniversalIdentifier, ) .filter(isDefined) - .filter((skill) => skill.id !== flatEntityId); + .filter((skill) => skill.universalIdentifier !== universalIdentifier); validationResult.errors.push( ...validateSkillNameUniqueness({ diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-field-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-field-validator.service.ts index d66b7a220a..9f2c88fdf9 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-field-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-field-validator.service.ts @@ -4,14 +4,14 @@ import { msg, t } from '@lingui/core/macro'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; +import { findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-universal-identifier-in-universal-flat-entity-maps-or-throw.util'; import { isViewFieldInLowestPosition } from 'src/engine/metadata-modules/flat-view-field/utils/is-view-field-in-lowest-position.util'; import { ViewExceptionCode } from 'src/engine/metadata-modules/view/exceptions/view.exception'; import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; import { validateLabelIdentifierFieldMetadataIdFlatViewField } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-label-identifier-field-metadata-id-flat-view-field.util'; @Injectable() @@ -19,7 +19,7 @@ export class FlatViewFieldValidatorService { constructor() {} public validateFlatViewFieldUpdate({ - flatEntityId, + universalIdentifier, flatEntityUpdate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatViewFieldMaps: optimisticFlatViewFieldMaps, @@ -29,15 +29,14 @@ export class FlatViewFieldValidatorService { }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.viewField >): FailedFlatEntityValidation<'viewField', 'update'> { - const existingFlatViewField = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const existingFlatViewField = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatViewFieldMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: existingFlatViewField?.universalIdentifier, + universalIdentifier, }, metadataName: 'viewField', type: 'update', @@ -60,13 +59,13 @@ export class FlatViewFieldValidatorService { validationResult.flatEntityMinimalInformation = { ...validationResult.flatEntityMinimalInformation, - id: updatedFlatViewField.id, - viewId: updatedFlatViewField.viewId, - fieldMetadataId: updatedFlatViewField.fieldMetadataId, + viewUniversalIdentifier: updatedFlatViewField.viewUniversalIdentifier, + fieldMetadataUniversalIdentifier: + updatedFlatViewField.fieldMetadataUniversalIdentifier, }; - const flatView = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: updatedFlatViewField.viewId, + const flatView = findFlatEntityByUniversalIdentifier({ + universalIdentifier: updatedFlatViewField.viewUniversalIdentifier, flatEntityMaps: flatViewMaps, }); @@ -80,8 +79,8 @@ export class FlatViewFieldValidatorService { return validationResult; } - const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatView.objectMetadataId, + const flatObjectMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatView.objectMetadataUniversalIdentifier, flatEntityMaps: flatObjectMetadataMaps, }); @@ -96,17 +95,20 @@ export class FlatViewFieldValidatorService { } if ( - flatObjectMetadata.labelIdentifierFieldMetadataId === - updatedFlatViewField.fieldMetadataId + flatObjectMetadata.labelIdentifierFieldMetadataUniversalIdentifier === + updatedFlatViewField.fieldMetadataUniversalIdentifier ) { - const otherFlatViewFields = findManyFlatEntityByIdInFlatEntityMapsOrThrow( - { - flatEntityIds: flatView.viewFieldIds.filter( - (flatViewId) => flatViewId !== updatedFlatViewField.id, - ), - flatEntityMaps: optimisticFlatViewFieldMaps, - }, - ); + const otherFlatViewFields = + findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow( + { + universalIdentifiers: flatView.viewFieldUniversalIdentifiers.filter( + (viewFieldUniversalIdentifier) => + viewFieldUniversalIdentifier !== + updatedFlatViewField.universalIdentifier, + ), + flatEntityMaps: optimisticFlatViewFieldMaps, + }, + ); validationResult.errors.push( ...validateLabelIdentifierFieldMetadataIdFlatViewField({ @@ -120,26 +122,25 @@ export class FlatViewFieldValidatorService { } public validateFlatViewFieldDeletion({ - flatEntityToValidate: { id: viewFieldIdToDelete, universalIdentifier }, + flatEntityToValidate: { universalIdentifier }, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatViewFieldMaps: optimisticFlatViewFieldMaps, flatFieldMetadataMaps, flatObjectMetadataMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.viewField >): FailedFlatEntityValidation<'viewField', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: viewFieldIdToDelete, universalIdentifier, }, metadataName: 'viewField', type: 'delete', }); - const existingFlatViewField = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: viewFieldIdToDelete, + const existingFlatViewField = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatViewFieldMaps, }); @@ -153,8 +154,9 @@ export class FlatViewFieldValidatorService { return validationResult; } - const flatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: existingFlatViewField.fieldMetadataId, + const flatFieldMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + existingFlatViewField.fieldMetadataUniversalIdentifier, flatEntityMaps: flatFieldMetadataMaps, }); @@ -162,8 +164,8 @@ export class FlatViewFieldValidatorService { return validationResult; } - const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatFieldMetadata.objectMetadataId, + const flatObjectMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatFieldMetadata.objectMetadataUniversalIdentifier, flatEntityMaps: flatObjectMetadataMaps, }); @@ -172,8 +174,8 @@ export class FlatViewFieldValidatorService { } if ( - flatObjectMetadata.labelIdentifierFieldMetadataId === - existingFlatViewField.fieldMetadataId + flatObjectMetadata.labelIdentifierFieldMetadataUniversalIdentifier === + existingFlatViewField.fieldMetadataUniversalIdentifier ) { validationResult.errors.push({ code: ViewExceptionCode.INVALID_VIEW_DATA, @@ -193,37 +195,37 @@ export class FlatViewFieldValidatorService { flatViewMaps, flatObjectMetadataMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.viewField >): FailedFlatEntityValidation<'viewField', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatViewFieldToValidate.id, universalIdentifier: flatViewFieldToValidate.universalIdentifier, - viewId: flatViewFieldToValidate.viewId, - fieldMetadataId: flatViewFieldToValidate.fieldMetadataId, + viewUniversalIdentifier: + flatViewFieldToValidate.viewUniversalIdentifier, + fieldMetadataUniversalIdentifier: + flatViewFieldToValidate.fieldMetadataUniversalIdentifier, }, metadataName: 'viewField', type: 'create', }); - const existingFlatViewField = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewFieldToValidate.id, + const existingFlatViewField = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatViewFieldToValidate.universalIdentifier, flatEntityMaps: optimisticFlatViewFieldMaps, }); if (isDefined(existingFlatViewField)) { - const flatViewFieldId = flatViewFieldToValidate.id; - validationResult.errors.push({ code: ViewExceptionCode.INVALID_VIEW_DATA, - message: t`View field metadata with id ${flatViewFieldId} already exists`, + message: t`View field metadata with this universal identifier already exists`, userFriendlyMessage: msg`View field metadata already exists`, }); } - const flatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewFieldToValidate.fieldMetadataId, + const flatFieldMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatViewFieldToValidate.fieldMetadataUniversalIdentifier, flatEntityMaps: flatFieldMetadataMaps, }); @@ -235,8 +237,8 @@ export class FlatViewFieldValidatorService { }); } - const flatView = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewFieldToValidate.viewId, + const flatView = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatViewFieldToValidate.viewUniversalIdentifier, flatEntityMaps: flatViewMaps, }); @@ -250,28 +252,30 @@ export class FlatViewFieldValidatorService { return validationResult; } - const otherFlatViewFields = findManyFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityIds: flatView.viewFieldIds, - flatEntityMaps: optimisticFlatViewFieldMaps, - }); + const otherFlatViewFields = + findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow({ + universalIdentifiers: flatView.viewFieldUniversalIdentifiers, + flatEntityMaps: optimisticFlatViewFieldMaps, + }); const equivalentExistingFlatViewFieldExists = otherFlatViewFields.some( (flatViewField) => - flatViewField.viewId === flatViewFieldToValidate.viewId && - flatViewField.fieldMetadataId === - flatViewFieldToValidate.fieldMetadataId, + flatViewField.viewUniversalIdentifier === + flatViewFieldToValidate.viewUniversalIdentifier && + flatViewField.fieldMetadataUniversalIdentifier === + flatViewFieldToValidate.fieldMetadataUniversalIdentifier, ); if (equivalentExistingFlatViewFieldExists) { validationResult.errors.push({ code: ViewExceptionCode.INVALID_VIEW_DATA, - message: t`View field with same fieldmetadataId and viewId already exists`, + message: t`View field with same fieldMetadataUniversalIdentifier and viewUniversalIdentifier already exists`, userFriendlyMessage: msg`View field already exists`, }); } - const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({ + const flatObjectMetadata = findFlatEntityByUniversalIdentifier({ flatEntityMaps: flatObjectMetadataMaps, - flatEntityId: flatView.objectMetadataId, + universalIdentifier: flatView.objectMetadataUniversalIdentifier, }); if (!isDefined(flatObjectMetadata)) { @@ -285,8 +289,8 @@ export class FlatViewFieldValidatorService { } if ( - flatObjectMetadata.labelIdentifierFieldMetadataId === - flatViewFieldToValidate.fieldMetadataId + flatObjectMetadata.labelIdentifierFieldMetadataUniversalIdentifier === + flatViewFieldToValidate.fieldMetadataUniversalIdentifier ) { validationResult.errors.push( ...validateLabelIdentifierFieldMetadataIdFlatViewField({ @@ -297,8 +301,8 @@ export class FlatViewFieldValidatorService { } else if ( otherFlatViewFields.some( (flatViewField) => - flatViewField.fieldMetadataId === - flatObjectMetadata.labelIdentifierFieldMetadataId, + flatViewField.fieldMetadataUniversalIdentifier === + flatObjectMetadata.labelIdentifierFieldMetadataUniversalIdentifier, ) && isViewFieldInLowestPosition({ flatViewField: flatViewFieldToValidate, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-filter-group-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-filter-group-validator.service.ts index 61b2c3ba27..009cca60d2 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-filter-group-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-filter-group-validator.service.ts @@ -4,17 +4,17 @@ import { msg, t } from '@lingui/core/macro'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { type FlatViewFilterGroupMaps } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group-maps.type'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { ViewFilterGroupExceptionCode } from 'src/engine/metadata-modules/view-filter-group/exceptions/view-filter-group.exception'; +import { type MetadataUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-maps.type'; import { validateFlatEntityCircularDependency } from 'src/engine/workspace-manager/workspace-migration/utils/validate-flat-entity-circular-dependency.util'; import { type FailedFlatEntityValidation, type FlatEntityValidationError, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { type FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { type UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; // View filter groups can have at most 2 levels of nesting (root and one child level) const VIEW_FILTER_GROUP_MAX_DEPTH = 2; @@ -24,19 +24,20 @@ export class FlatViewFilterGroupValidatorService { constructor() {} private getCircularDependencyValidationErrors({ - viewFilterGroupId, - parentViewFilterGroupId, + viewFilterGroupUniversalIdentifier, + parentViewFilterGroupUniversalIdentifier, flatViewFilterGroupMaps, }: { - viewFilterGroupId: string; - parentViewFilterGroupId: string; - flatViewFilterGroupMaps: FlatViewFilterGroupMaps; + viewFilterGroupUniversalIdentifier: string; + parentViewFilterGroupUniversalIdentifier: string; + flatViewFilterGroupMaps: MetadataUniversalFlatEntityMaps<'viewFilterGroup'>; }): FlatEntityValidationError[] { const circularDependencyResult = validateFlatEntityCircularDependency({ - flatEntityId: viewFilterGroupId, - flatEntityParentId: parentViewFilterGroupId, + flatEntityUniversalIdentifier: viewFilterGroupUniversalIdentifier, + flatEntityParentUniversalIdentifier: + parentViewFilterGroupUniversalIdentifier, maxDepth: VIEW_FILTER_GROUP_MAX_DEPTH, - parentIdKey: 'parentViewFilterGroupId', + parentUniversalIdentifierKey: 'parentViewFilterGroupUniversalIdentifier', flatEntityMaps: flatViewFilterGroupMaps, }); @@ -79,33 +80,33 @@ export class FlatViewFilterGroupValidatorService { flatViewMaps, }, remainingFlatEntityMapsToValidate, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.viewFilterGroup >): FailedFlatEntityValidation<'viewFilterGroup', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatViewFilterGroupToValidate.id, universalIdentifier: flatViewFilterGroupToValidate.universalIdentifier, }, metadataName: 'viewFilterGroup', type: 'create', }); - const existingViewFilterGroup = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewFilterGroupToValidate.id, + const existingViewFilterGroup = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatViewFilterGroupToValidate.universalIdentifier, flatEntityMaps: optimisticFlatViewFilterGroupMaps, }); if (isDefined(existingViewFilterGroup)) { validationResult.errors.push({ code: ViewFilterGroupExceptionCode.INVALID_VIEW_FILTER_GROUP_DATA, - message: t`View filter group with this id already exists`, - userFriendlyMessage: msg`View filter group with this id already exists`, + message: t`View filter group with this universal identifier already exists`, + userFriendlyMessage: msg`View filter group already exists`, }); } - const referencedView = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewFilterGroupToValidate.viewId, + const referencedView = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatViewFilterGroupToValidate.viewUniversalIdentifier, flatEntityMaps: flatViewMaps, }); @@ -117,12 +118,17 @@ export class FlatViewFilterGroupValidatorService { }); } - if (isDefined(flatViewFilterGroupToValidate.parentViewFilterGroupId)) { + if ( + isDefined( + flatViewFilterGroupToValidate.parentViewFilterGroupUniversalIdentifier, + ) + ) { const circularDependencyErrors = this.getCircularDependencyValidationErrors({ - viewFilterGroupId: flatViewFilterGroupToValidate.id, - parentViewFilterGroupId: - flatViewFilterGroupToValidate.parentViewFilterGroupId, + viewFilterGroupUniversalIdentifier: + flatViewFilterGroupToValidate.universalIdentifier, + parentViewFilterGroupUniversalIdentifier: + flatViewFilterGroupToValidate.parentViewFilterGroupUniversalIdentifier, flatViewFilterGroupMaps: optimisticFlatViewFilterGroupMaps, }); @@ -130,13 +136,15 @@ export class FlatViewFilterGroupValidatorService { validationResult.errors.push(...circularDependencyErrors); } - const referencedParentInOptimistic = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewFilterGroupToValidate.parentViewFilterGroupId, + const referencedParentInOptimistic = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatViewFilterGroupToValidate.parentViewFilterGroupUniversalIdentifier, flatEntityMaps: optimisticFlatViewFilterGroupMaps, }); - const referencedParentInRemaining = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewFilterGroupToValidate.parentViewFilterGroupId, + const referencedParentInRemaining = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatViewFilterGroupToValidate.parentViewFilterGroupUniversalIdentifier, flatEntityMaps: remainingFlatEntityMapsToValidate, }); @@ -160,20 +168,19 @@ export class FlatViewFilterGroupValidatorService { optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatViewFilterGroupMaps: optimisticFlatViewFilterGroupMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.viewFilterGroup >): FailedFlatEntityValidation<'viewFilterGroup', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatViewFilterGroupToValidate.id, universalIdentifier: flatViewFilterGroupToValidate.universalIdentifier, }, metadataName: 'viewFilterGroup', type: 'delete', }); - const existingViewFilterGroup = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewFilterGroupToValidate.id, + const existingViewFilterGroup = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatViewFilterGroupToValidate.universalIdentifier, flatEntityMaps: optimisticFlatViewFilterGroupMaps, }); @@ -189,7 +196,7 @@ export class FlatViewFilterGroupValidatorService { } validateFlatViewFilterGroupUpdate({ - flatEntityId, + universalIdentifier, flatEntityUpdate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatViewFilterGroupMaps: optimisticFlatViewFilterGroupMaps, @@ -197,15 +204,14 @@ export class FlatViewFilterGroupValidatorService { }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.viewFilterGroup >): FailedFlatEntityValidation<'viewFilterGroup', 'update'> { - const existingViewFilterGroup = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const existingViewFilterGroup = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatViewFilterGroupMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: existingViewFilterGroup?.universalIdentifier, + universalIdentifier, }, metadataName: 'viewFilterGroup', type: 'update', @@ -217,21 +223,26 @@ export class FlatViewFilterGroupValidatorService { message: t`View filter group not found`, userFriendlyMessage: msg`View filter group not found`, }); - } - const parentViewFilterGroupIdUpdate = - flatEntityUpdate.parentViewFilterGroupId; - - if (!isDefined(parentViewFilterGroupIdUpdate)) { return validationResult; } - const newParentViewFilterGroupId = parentViewFilterGroupIdUpdate; + const parentViewFilterGroupUniversalIdentifierUpdate = + flatEntityUpdate.parentViewFilterGroupUniversalIdentifier; + + if (!isDefined(parentViewFilterGroupUniversalIdentifierUpdate)) { + return validationResult; + } + + const newParentViewFilterGroupUniversalIdentifier = + parentViewFilterGroupUniversalIdentifierUpdate; const circularDependencyErrors = this.getCircularDependencyValidationErrors( { - viewFilterGroupId: flatEntityId, - parentViewFilterGroupId: newParentViewFilterGroupId, + viewFilterGroupUniversalIdentifier: + existingViewFilterGroup.universalIdentifier, + parentViewFilterGroupUniversalIdentifier: + newParentViewFilterGroupUniversalIdentifier, flatViewFilterGroupMaps: optimisticFlatViewFilterGroupMaps, }, ); @@ -240,10 +251,12 @@ export class FlatViewFilterGroupValidatorService { validationResult.errors.push(...circularDependencyErrors); } - const referencedParentViewFilterGroup = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: newParentViewFilterGroupId, - flatEntityMaps: optimisticFlatViewFilterGroupMaps, - }); + const referencedParentViewFilterGroup = findFlatEntityByUniversalIdentifier( + { + universalIdentifier: newParentViewFilterGroupUniversalIdentifier, + flatEntityMaps: optimisticFlatViewFilterGroupMaps, + }, + ); if (!isDefined(referencedParentViewFilterGroup)) { validationResult.errors.push({ diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-filter-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-filter-validator.service.ts index b9d0180e32..e491a13cb7 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-filter-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-filter-validator.service.ts @@ -4,12 +4,12 @@ import { msg, t } from '@lingui/core/macro'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { ViewFilterExceptionCode } from 'src/engine/metadata-modules/view-filter/exceptions/view-filter.exception'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { type FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { type UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; @Injectable() export class FlatViewFilterValidatorService { @@ -23,33 +23,32 @@ export class FlatViewFilterValidatorService { flatFieldMetadataMaps, flatViewFilterGroupMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.viewFilter >): FailedFlatEntityValidation<'viewFilter', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatViewFilterToValidate.id, universalIdentifier: flatViewFilterToValidate.universalIdentifier, }, metadataName: 'viewFilter', type: 'create', }); - const existingViewFilter = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewFilterToValidate.id, + const existingViewFilter = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatViewFilterToValidate.universalIdentifier, flatEntityMaps: optimisticFlatViewFilterMaps, }); if (isDefined(existingViewFilter)) { validationResult.errors.push({ code: ViewFilterExceptionCode.INVALID_VIEW_FILTER_DATA, - message: t`View filter with this id already exists`, - userFriendlyMessage: msg`View filter with this id already exists`, + message: t`View filter with this universal identifier already exists`, + userFriendlyMessage: msg`View filter already exists`, }); } - const referencedView = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewFilterToValidate.viewId, + const referencedView = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatViewFilterToValidate.viewUniversalIdentifier, flatEntityMaps: flatViewMaps, }); @@ -61,8 +60,9 @@ export class FlatViewFilterValidatorService { }); } - const referencedFieldMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewFilterToValidate.fieldMetadataId, + const referencedFieldMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatViewFilterToValidate.fieldMetadataUniversalIdentifier, flatEntityMaps: flatFieldMetadataMaps, }); @@ -74,9 +74,12 @@ export class FlatViewFilterValidatorService { }); } - if (isDefined(flatViewFilterToValidate.viewFilterGroupId)) { - const referencedViewFilterGroup = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewFilterToValidate.viewFilterGroupId, + if ( + isDefined(flatViewFilterToValidate.viewFilterGroupUniversalIdentifier) + ) { + const referencedViewFilterGroup = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatViewFilterToValidate.viewFilterGroupUniversalIdentifier, flatEntityMaps: flatViewFilterGroupMaps, }); @@ -97,20 +100,19 @@ export class FlatViewFilterValidatorService { optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatViewFilterMaps: optimisticFlatViewFilterMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.viewFilter >): FailedFlatEntityValidation<'viewFilter', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatViewFilterToValidate.id, universalIdentifier: flatViewFilterToValidate.universalIdentifier, }, metadataName: 'viewFilter', type: 'delete', }); - const existingViewFilter = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewFilterToValidate.id, + const existingViewFilter = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatViewFilterToValidate.universalIdentifier, flatEntityMaps: optimisticFlatViewFilterMaps, }); @@ -128,7 +130,7 @@ export class FlatViewFilterValidatorService { } validateFlatViewFilterUpdate({ - flatEntityId, + universalIdentifier, flatEntityUpdate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatViewFilterMaps: optimisticFlatViewFilterMaps, @@ -138,15 +140,14 @@ export class FlatViewFilterValidatorService { }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.viewFilter >): FailedFlatEntityValidation<'viewFilter', 'update'> { - const existingViewFilter = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const existingViewFilter = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatViewFilterMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: existingViewFilter?.universalIdentifier, + universalIdentifier, }, metadataName: 'viewFilter', type: 'update', @@ -167,8 +168,9 @@ export class FlatViewFilterValidatorService { ...flatEntityUpdate, }; - const referencedFieldMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: updatedFlatViewFilter.fieldMetadataId, + const referencedFieldMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + updatedFlatViewFilter.fieldMetadataUniversalIdentifier, flatEntityMaps: flatFieldMetadataMaps, }); @@ -180,9 +182,10 @@ export class FlatViewFilterValidatorService { }); } - if (isDefined(updatedFlatViewFilter.viewFilterGroupId)) { - const referencedViewFilterGroup = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: updatedFlatViewFilter.viewFilterGroupId, + if (isDefined(updatedFlatViewFilter.viewFilterGroupUniversalIdentifier)) { + const referencedViewFilterGroup = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + updatedFlatViewFilter.viewFilterGroupUniversalIdentifier, flatEntityMaps: flatViewFilterGroupMaps, }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-group-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-group-validator.service.ts index 8695af8674..898bfa9a13 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-group-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-group-validator.service.ts @@ -4,17 +4,17 @@ import { msg, t } from '@lingui/core/macro'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { ViewExceptionCode } from 'src/engine/metadata-modules/view/exceptions/view.exception'; import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; @Injectable() export class FlatViewGroupValidatorService { public validateFlatViewGroupUpdate({ - flatEntityId, + universalIdentifier, flatEntityUpdate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatViewGroupMaps: optimisticFlatViewGroupMaps, @@ -23,15 +23,14 @@ export class FlatViewGroupValidatorService { }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.viewGroup >): FailedFlatEntityValidation<'viewGroup', 'update'> { - const existingFlatViewGroup = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const existingFlatViewGroup = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatViewGroupMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: existingFlatViewGroup?.universalIdentifier, + universalIdentifier, }, metadataName: 'viewGroup', type: 'update', @@ -62,12 +61,11 @@ export class FlatViewGroupValidatorService { validationResult.flatEntityMinimalInformation = { ...validationResult.flatEntityMinimalInformation, - id: updatedFlatViewGroup.id, - viewId: updatedFlatViewGroup.viewId, + viewUniversalIdentifier: updatedFlatViewGroup.viewUniversalIdentifier, }; - const flatView = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: updatedFlatViewGroup.viewId, + const flatView = findFlatEntityByUniversalIdentifier({ + universalIdentifier: updatedFlatViewGroup.viewUniversalIdentifier, flatEntityMaps: flatViewMaps, }); @@ -83,24 +81,23 @@ export class FlatViewGroupValidatorService { } public validateFlatViewGroupDeletion({ - flatEntityToValidate: { id: viewGroupIdToDelete, universalIdentifier }, + flatEntityToValidate: { universalIdentifier }, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatViewGroupMaps: optimisticFlatViewGroupMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.viewGroup >): FailedFlatEntityValidation<'viewGroup', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: viewGroupIdToDelete, universalIdentifier, }, metadataName: 'viewGroup', type: 'delete', }); - const existingFlatViewGroup = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: viewGroupIdToDelete, + const existingFlatViewGroup = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatViewGroupMaps, }); @@ -121,36 +118,37 @@ export class FlatViewGroupValidatorService { flatViewGroupMaps: optimisticFlatViewGroupMaps, flatViewMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.viewGroup >): FailedFlatEntityValidation<'viewGroup', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatViewGroupToValidate.id, universalIdentifier: flatViewGroupToValidate.universalIdentifier, - viewId: flatViewGroupToValidate.viewId, + viewUniversalIdentifier: + flatViewGroupToValidate.viewUniversalIdentifier, }, metadataName: 'viewGroup', type: 'create', }); - const existingFlatViewGroup = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewGroupToValidate.id, + const existingFlatViewGroup = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatViewGroupToValidate.universalIdentifier, flatEntityMaps: optimisticFlatViewGroupMaps, }); if (isDefined(existingFlatViewGroup)) { - const flatViewGroupId = flatViewGroupToValidate.id; + const flatViewGroupUniversalIdentifier = + flatViewGroupToValidate.universalIdentifier; validationResult.errors.push({ code: ViewExceptionCode.INVALID_VIEW_DATA, - message: t`View group metadata with id ${flatViewGroupId} already exists`, + message: t`View group metadata with universal identifier ${flatViewGroupUniversalIdentifier} already exists`, userFriendlyMessage: msg`View group metadata already exists`, }); } - const flatView = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewGroupToValidate.viewId, + const flatView = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatViewGroupToValidate.viewUniversalIdentifier, flatEntityMaps: flatViewMaps, }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-validator.service.ts index 5cddc2657b..a70e97d941 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-validator.service.ts @@ -3,20 +3,20 @@ import { type ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { ViewType } from 'src/engine/metadata-modules/view/enums/view-type.enum'; +import { type UniversalFlatView } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view.type'; import { ViewExceptionCode } from 'src/engine/metadata-modules/view/exceptions/view.exception'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { type FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { type UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; export class FlatViewValidatorService { constructor() {} public validateFlatViewUpdate({ - flatEntityId, + universalIdentifier, flatEntityUpdate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatViewMaps: optimisticFlatViewMaps, @@ -25,15 +25,14 @@ export class FlatViewValidatorService { }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.view >): FailedFlatEntityValidation<'view', 'update'> { - const existingFlatView = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const existingFlatView = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatViewMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: existingFlatView?.universalIdentifier, + universalIdentifier, }, metadataName: 'view', type: 'update', @@ -49,20 +48,23 @@ export class FlatViewValidatorService { return validationResult; } - const updatedFlatView: FlatView = { + const updatedFlatView: UniversalFlatView = { ...existingFlatView, ...flatEntityUpdate, }; - const kanbanAggregateOperationFieldMetadataIdUpdate = - flatEntityUpdate.kanbanAggregateOperationFieldMetadataId; + const kanbanAggregateOperationFieldMetadataUniversalIdentifierUpdate = + flatEntityUpdate.kanbanAggregateOperationFieldMetadataUniversalIdentifier; if ( - isDefined(kanbanAggregateOperationFieldMetadataIdUpdate) && - kanbanAggregateOperationFieldMetadataIdUpdate !== null && + isDefined( + kanbanAggregateOperationFieldMetadataUniversalIdentifierUpdate, + ) && + kanbanAggregateOperationFieldMetadataUniversalIdentifierUpdate !== null && !isDefined( - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: kanbanAggregateOperationFieldMetadataIdUpdate, + findFlatEntityByUniversalIdentifier({ + universalIdentifier: + kanbanAggregateOperationFieldMetadataUniversalIdentifierUpdate, flatEntityMaps: flatFieldMetadataMaps, }), ) @@ -79,7 +81,9 @@ export class FlatViewValidatorService { existingFlatView.type !== ViewType.KANBAN; if (viewBecomesKanban) { - if (!isDefined(updatedFlatView.mainGroupByFieldMetadataId)) { + if ( + !isDefined(updatedFlatView.mainGroupByFieldMetadataUniversalIdentifier) + ) { validationResult.errors.push({ code: ViewExceptionCode.INVALID_VIEW_DATA, message: t`Kanban view must have a main group by field`, @@ -89,8 +93,9 @@ export class FlatViewValidatorService { return validationResult; } - const mainGroupByFieldMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: updatedFlatView.mainGroupByFieldMetadataId, + const mainGroupByFieldMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + updatedFlatView.mainGroupByFieldMetadataUniversalIdentifier, flatEntityMaps: flatFieldMetadataMaps, }); @@ -109,17 +114,17 @@ export class FlatViewValidatorService { } } - const updatedMainGroupByFieldMetadataId = - updatedFlatView.mainGroupByFieldMetadataId; + const updatedMainGroupByFieldMetadataUniversalIdentifier = + updatedFlatView.mainGroupByFieldMetadataUniversalIdentifier; const mainGroupByFieldMetadataIsAddedOrUpdated = - isDefined(updatedMainGroupByFieldMetadataId) && - existingFlatView.mainGroupByFieldMetadataId !== - updatedMainGroupByFieldMetadataId; + isDefined(updatedMainGroupByFieldMetadataUniversalIdentifier) && + existingFlatView.mainGroupByFieldMetadataUniversalIdentifier !== + updatedMainGroupByFieldMetadataUniversalIdentifier; if (mainGroupByFieldMetadataIsAddedOrUpdated && !viewBecomesKanban) { - const mainGroupByFieldMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: updatedMainGroupByFieldMetadataId, + const mainGroupByFieldMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: updatedMainGroupByFieldMetadataUniversalIdentifier, flatEntityMaps: flatFieldMetadataMaps, }); @@ -146,20 +151,19 @@ export class FlatViewValidatorService { optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatViewMaps: optimisticFlatViewMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.view >): FailedFlatEntityValidation<'view', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityToValidate.id, universalIdentifier: flatEntityToValidate.universalIdentifier, }, metadataName: 'view', type: 'delete', }); - const existingFlatView = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatEntityToValidate.id, + const existingFlatView = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatEntityToValidate.universalIdentifier, flatEntityMaps: optimisticFlatViewMaps, }); @@ -181,20 +185,19 @@ export class FlatViewValidatorService { flatFieldMetadataMaps, flatObjectMetadataMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.view >): FailedFlatEntityValidation<'view', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatViewToValidate.id, universalIdentifier: flatViewToValidate.universalIdentifier, }, metadataName: 'view', type: 'create', }); - const optimisticFlatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewToValidate.objectMetadataId, + const optimisticFlatObjectMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatViewToValidate.objectMetadataUniversalIdentifier, flatEntityMaps: flatObjectMetadataMaps, }); @@ -208,25 +211,27 @@ export class FlatViewValidatorService { if ( isDefined( - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewToValidate.id, + findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatViewToValidate.universalIdentifier, flatEntityMaps: optimisticFlatViewMaps, }), ) ) { validationResult.errors.push({ code: ViewExceptionCode.INVALID_VIEW_DATA, - message: t`View with same id is already exists`, + message: t`View with same universal identifier already exists`, userFriendlyMessage: msg`View already exists`, }); } if ( - isDefined(flatViewToValidate.kanbanAggregateOperationFieldMetadataId) && + isDefined( + flatViewToValidate.kanbanAggregateOperationFieldMetadataUniversalIdentifier, + ) && !isDefined( - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: - flatViewToValidate.kanbanAggregateOperationFieldMetadataId, + findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatViewToValidate.kanbanAggregateOperationFieldMetadataUniversalIdentifier, flatEntityMaps: flatFieldMetadataMaps, }), ) @@ -241,7 +246,11 @@ export class FlatViewValidatorService { const isKanban = flatViewToValidate.type === ViewType.KANBAN; if (isKanban) { - if (!isDefined(flatViewToValidate.mainGroupByFieldMetadataId)) { + if ( + !isDefined( + flatViewToValidate.mainGroupByFieldMetadataUniversalIdentifier, + ) + ) { validationResult.errors.push({ code: ViewExceptionCode.INVALID_VIEW_DATA, message: t`Kanban view must have a main group by field`, @@ -251,8 +260,9 @@ export class FlatViewValidatorService { return validationResult; } - const mainGroupByFieldMetadata = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatViewToValidate.mainGroupByFieldMetadataId, + const mainGroupByFieldMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatViewToValidate.mainGroupByFieldMetadataUniversalIdentifier, flatEntityMaps: flatFieldMetadataMaps, }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-webhook-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-webhook-validator.service.ts index 7f8920dd65..1ea9a4324a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-webhook-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-webhook-validator.service.ts @@ -5,12 +5,12 @@ import { isNonEmptyString } from '@sniptt/guards'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { WebhookExceptionCode } from 'src/engine/metadata-modules/webhook/webhook.exception'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; -import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; -import { type FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; +import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; +import { type UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; @Injectable() export class FlatWebhookValidatorService { @@ -26,12 +26,11 @@ export class FlatWebhookValidatorService { public validateFlatWebhookCreation({ flatEntityToValidate: flatWebhook, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.webhook >): FailedFlatEntityValidation<'webhook', 'create'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatWebhook.id, universalIdentifier: flatWebhook.universalIdentifier, targetUrl: flatWebhook.targetUrl, }, @@ -63,12 +62,11 @@ export class FlatWebhookValidatorService { optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatWebhookMaps: optimisticFlatWebhookMaps, }, - }: FlatEntityValidationArgs< + }: UniversalFlatEntityValidationArgs< typeof ALL_METADATA_NAME.webhook >): FailedFlatEntityValidation<'webhook', 'delete'> { const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityToValidate.id, universalIdentifier: flatEntityToValidate.universalIdentifier, targetUrl: flatEntityToValidate.targetUrl, }, @@ -76,8 +74,8 @@ export class FlatWebhookValidatorService { type: 'delete', }); - const existingWebhook = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: flatEntityToValidate.id, + const existingWebhook = findFlatEntityByUniversalIdentifier({ + universalIdentifier: flatEntityToValidate.universalIdentifier, flatEntityMaps: optimisticFlatWebhookMaps, }); @@ -93,7 +91,7 @@ export class FlatWebhookValidatorService { } public validateFlatWebhookUpdate({ - flatEntityId, + universalIdentifier, flatEntityUpdate, optimisticFlatEntityMapsAndRelatedFlatEntityMaps: { flatWebhookMaps: optimisticFlatWebhookMaps, @@ -101,15 +99,14 @@ export class FlatWebhookValidatorService { }: FlatEntityUpdateValidationArgs< typeof ALL_METADATA_NAME.webhook >): FailedFlatEntityValidation<'webhook', 'update'> { - const fromFlatWebhook = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId, + const fromFlatWebhook = findFlatEntityByUniversalIdentifier({ + universalIdentifier, flatEntityMaps: optimisticFlatWebhookMaps, }); const validationResult = getEmptyFlatEntityValidationError({ flatEntityMinimalInformation: { - id: flatEntityId, - universalIdentifier: fromFlatWebhook?.universalIdentifier, + universalIdentifier, }, metadataName: 'webhook', type: 'update', diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-label-identifier-field-metadata-id-flat-view-field.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-label-identifier-field-metadata-id-flat-view-field.util.ts index 5e5c66c675..cfa0de5398 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-label-identifier-field-metadata-id-flat-view-field.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-label-identifier-field-metadata-id-flat-view-field.util.ts @@ -1,14 +1,14 @@ import { msg, t } from '@lingui/core/macro'; import { isDefined } from 'twenty-shared/utils'; -import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type'; import { isViewFieldInLowestPosition } from 'src/engine/metadata-modules/flat-view-field/utils/is-view-field-in-lowest-position.util'; import { ViewExceptionCode } from 'src/engine/metadata-modules/view/exceptions/view.exception'; +import { type UniversalFlatViewField } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-field.type'; import { type FlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; type ValidateLabelIdentifierFieldMetadataIdFlatViewFieldArgs = { - otherFlatViewFields: FlatViewField[]; - flatViewFieldToValidate: FlatViewField; + otherFlatViewFields: UniversalFlatViewField[]; + flatViewFieldToValidate: UniversalFlatViewField; }; export const validateLabelIdentifierFieldMetadataIdFlatViewField = ({ otherFlatViewFields, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-skill-name-uniqueness.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-skill-name-uniqueness.util.ts index 1799826e93..de8b5eccd2 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-skill-name-uniqueness.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-skill-name-uniqueness.util.ts @@ -1,7 +1,7 @@ import { msg, t } from '@lingui/core/macro'; -import { type FlatSkill } from 'src/engine/metadata-modules/flat-skill/types/flat-skill.type'; import { SkillExceptionCode } from 'src/engine/metadata-modules/skill/skill.exception'; +import { type UniversalFlatSkill } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-skill.type'; import { type FlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; export const validateSkillNameUniqueness = ({ @@ -9,7 +9,7 @@ export const validateSkillNameUniqueness = ({ existingFlatSkills, }: { name: string; - existingFlatSkills: FlatSkill[]; + existingFlatSkills: UniversalFlatSkill[]; }): FlatEntityValidationError[] => { const errors: FlatEntityValidationError[] = []; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-skill-required-properties.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-skill-required-properties.util.ts index d6a476e7b5..1db34782e2 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-skill-required-properties.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/utils/validate-skill-required-properties.util.ts @@ -1,14 +1,14 @@ import { msg, t } from '@lingui/core/macro'; import { isNonEmptyString } from '@sniptt/guards'; -import { type FlatSkill } from 'src/engine/metadata-modules/flat-skill/types/flat-skill.type'; import { SkillExceptionCode } from 'src/engine/metadata-modules/skill/skill.exception'; +import { type UniversalFlatSkill } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-skill.type'; import { type FlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; export const validateSkillLabelIsDefined = ({ flatSkill, }: { - flatSkill: FlatSkill; + flatSkill: UniversalFlatSkill; }): FlatEntityValidationError[] => { if (isNonEmptyString(flatSkill.label)) { return []; @@ -26,7 +26,7 @@ export const validateSkillLabelIsDefined = ({ export const validateSkillContentIsDefined = ({ flatSkill, }: { - flatSkill: FlatSkill; + flatSkill: UniversalFlatSkill; }): FlatEntityValidationError[] => { if (isNonEmptyString(flatSkill.content)) { return []; @@ -44,7 +44,7 @@ export const validateSkillContentIsDefined = ({ export const validateSkillRequiredProperties = ({ flatSkill, }: { - flatSkill: FlatSkill; + flatSkill: UniversalFlatSkill; }): FlatEntityValidationError[] => [ ...validateSkillLabelIsDefined({ flatSkill }), ...validateSkillContentIsDefined({ flatSkill }), diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/agent/services/update-agent-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/agent/services/update-agent-action-handler.service.ts index c21a49625c..7fa5ea65dc 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/agent/services/update-agent-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/agent/services/update-agent-action-handler.service.ts @@ -5,7 +5,12 @@ import { type QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialE import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { AgentEntity } from 'src/engine/metadata-modules/ai/ai-agent/entities/agent.entity'; -import { FlatUpdateAgentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdateAgentAction, + UniversalUpdateAgentAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -17,9 +22,27 @@ export class UpdateAgentActionHandlerService extends WorkspaceMigrationRunnerAct 'agent', ) { override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatAgent = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatAgentMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'agent', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'agent', + entityId: flatAgent.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/command-menu-item/services/update-command-menu-item-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/command-menu-item/services/update-command-menu-item-action-handler.service.ts index 601ab6805a..74e7f297e6 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/command-menu-item/services/update-command-menu-item-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/command-menu-item/services/update-command-menu-item-action-handler.service.ts @@ -2,8 +2,13 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { CommandMenuItemEntity } from 'src/engine/metadata-modules/command-menu-item/entities/command-menu-item.entity'; -import { FlatUpdateCommandMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdateCommandMenuItemAction, + UniversalUpdateCommandMenuItemAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -15,9 +20,27 @@ export class UpdateCommandMenuItemActionHandlerService extends WorkspaceMigratio 'commandMenuItem', ) { override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatCommandMenuItem = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatCommandMenuItemMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'commandMenuItem', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'commandMenuItem', + entityId: flatCommandMenuItem.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/update-field-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/update-field-action-handler.service.ts index b313f416cd..3d42be8b17 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/update-field-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/update-field-action-handler.service.ts @@ -12,7 +12,6 @@ import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-mana import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { computeCompositeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util'; import { getCompositeTypeOrThrow } from 'src/engine/metadata-modules/field-metadata/utils/get-composite-type-or-throw.util'; -import { FlatEntityUpdate } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; @@ -24,12 +23,15 @@ import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-meta import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service'; import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util'; import { isMorphOrRelationFieldMetadataType } from 'src/engine/utils/is-morph-or-relation-field-metadata-type.util'; +import { UniversalFlatEntityUpdate } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-update.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; import { convertOnDeleteActionToOnDelete } from 'src/engine/workspace-manager/workspace-migration/utils/convert-on-delete-action-to-on-delete.util'; import { FlatUpdateFieldAction, UniversalUpdateFieldAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; import { serializeDefaultValue } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/utils/serialize-default-value.util'; +import { fromUniversalSettingsToFlatFieldMetadataSettings } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/from-universal-settings-to-flat-field-metadata-settings.util'; import { WorkspaceMigrationActionExecutionException, WorkspaceMigrationActionExecutionExceptionCode, @@ -54,7 +56,7 @@ type UpdateFieldPropertyHandlerArgs< schemaName: string; tableName: string; flatFieldMetadata: FlatFieldMetadata; - update: FlatEntityUpdate<'fieldMetadata'>; + update: UniversalFlatEntityUpdate<'fieldMetadata'>; }; type NameUpdateHandlerArgs = @@ -96,14 +98,30 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct universalIdentifier: action.universalIdentifier, }); - // TODO: transpile settings universal identifiers when builder has been migrated - // For now, updates only contain flat entity diff properties (already IDs, not universal identifiers) + const { universalSettings, ...updateWithResolvedForeignKeys } = + resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'fieldMetadata', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + const update = + universalSettings === undefined + ? updateWithResolvedForeignKeys + : { + ...updateWithResolvedForeignKeys, + settings: fromUniversalSettingsToFlatFieldMetadataSettings({ + universalSettings, + allFieldIdToBeCreatedInActionByUniversalIdentifierMap: new Map(), + flatFieldMetadataMaps: allFlatEntityMaps.flatFieldMetadataMaps, + }), + }; return { type: 'update', metadataName: 'fieldMetadata', entityId: flatFieldMetadata.id, - update: action.update, + update, }; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/front-component/services/update-front-component-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/front-component/services/update-front-component-action-handler.service.ts index 6a7a51235d..1501d35bfa 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/front-component/services/update-front-component-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/front-component/services/update-front-component-action-handler.service.ts @@ -2,8 +2,13 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { FrontComponentEntity } from 'src/engine/metadata-modules/front-component/entities/front-component.entity'; -import { FlatUpdateFrontComponentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdateFrontComponentAction, + UniversalUpdateFrontComponentAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -15,9 +20,27 @@ export class UpdateFrontComponentActionHandlerService extends WorkspaceMigration 'frontComponent', ) { override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatFrontComponent = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatFrontComponentMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'frontComponent', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'frontComponent', + entityId: flatFrontComponent.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/create-index-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/create-index-action-handler.service.ts index 795a50982e..33ebe04662 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/create-index-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/create-index-action-handler.service.ts @@ -1,10 +1,16 @@ import { Injectable } from '@nestjs/common'; +import { v4 } from 'uuid'; + import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service'; -import { type FlatCreateIndexAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action'; +import { + type FlatCreateIndexAction, + type UniversalCreateIndexAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action'; +import { fromUniversalFlatIndexToFlatIndex } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/utils/from-universal-flat-index-to-flat-index.util'; import { createIndexInWorkspaceSchema, insertIndexMetadata, @@ -26,9 +32,23 @@ export class CreateIndexActionHandlerService extends WorkspaceMigrationRunnerAct } override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps, workspaceId, flatApplication } = context; + + const flatEntity = fromUniversalFlatIndexToFlatIndex({ + universalFlatIndexMetadata: action.flatEntity, + indexMetadataId: action.id ?? v4(), + allFlatEntityMaps, + workspaceId, + applicationId: flatApplication.id, + }); + + return { + type: action.type, + metadataName: action.metadataName, + flatEntity, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/update-index-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/update-index-action-handler.service.ts index e2b1bf33c3..45c864a3ce 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/update-index-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/update-index-action-handler.service.ts @@ -1,11 +1,18 @@ import { Injectable } from '@nestjs/common'; +import { v4 } from 'uuid'; + import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service'; import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; -import { type FlatUpdateIndexAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action'; +import { + type FlatUpdateIndexAction, + type UniversalUpdateIndexAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action'; +import { fromUniversalFlatIndexToFlatIndex } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/utils/from-universal-flat-index-to-flat-index.util'; import { createIndexInWorkspaceSchema, deleteIndexMetadata, @@ -29,9 +36,30 @@ export class UpdateIndexActionHandlerService extends WorkspaceMigrationRunnerAct } override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps, workspaceId, flatApplication } = context; + + const flatIndexMetadata = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatIndexMaps, + universalIdentifier: action.universalIdentifier, + }); + + const updatedFlatIndex = fromUniversalFlatIndexToFlatIndex({ + universalFlatIndexMetadata: action.updatedUniversalFlatIndex, + indexMetadataId: v4(), + allFlatEntityMaps, + workspaceId, + applicationId: flatApplication.id, + }); + + return { + type: action.type, + metadataName: action.metadataName, + entityId: flatIndexMetadata.id, + update: {}, + updatedFlatIndex, + }; } async executeForMetadata( @@ -48,7 +76,7 @@ export class UpdateIndexActionHandlerService extends WorkspaceMigrationRunnerAct // Create new index metadata await insertIndexMetadata({ - flatIndexMetadata: flatAction.updatedFlatEntity, + flatIndexMetadata: flatAction.updatedFlatIndex, queryRunner, }); } @@ -67,7 +95,7 @@ export class UpdateIndexActionHandlerService extends WorkspaceMigrationRunnerAct workspaceId, } = context; - const { entityId, updatedFlatEntity } = flatAction; + const { entityId, updatedFlatIndex } = flatAction; // Get the old index to drop it const flatIndexMetadataToDelete = findFlatEntityByIdInFlatEntityMapsOrThrow( @@ -90,11 +118,11 @@ export class UpdateIndexActionHandlerService extends WorkspaceMigrationRunnerAct // Create new index const flatObjectMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({ flatEntityMaps: flatObjectMetadataMaps, - flatEntityId: updatedFlatEntity.objectMetadataId, + flatEntityId: updatedFlatIndex.objectMetadataId, }); await createIndexInWorkspaceSchema({ - flatIndexMetadata: updatedFlatEntity, + flatIndexMetadata: updatedFlatIndex, flatObjectMetadata, flatFieldMetadataMaps, workspaceSchemaManagerService: this.workspaceSchemaManagerService, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/utils/from-universal-flat-index-to-flat-index.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/utils/from-universal-flat-index-to-flat-index.util.ts new file mode 100644 index 0000000000..5667f225da --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/utils/from-universal-flat-index-to-flat-index.util.ts @@ -0,0 +1,89 @@ +import { isDefined } from 'twenty-shared/utils'; +import { v4 } from 'uuid'; + +import { + FlatEntityMapsException, + FlatEntityMapsExceptionCode, +} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; +import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; +import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; +import { type UniversalFlatIndexMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-index-metadata.type'; + +export const fromUniversalFlatIndexToFlatIndex = ({ + universalFlatIndexMetadata, + indexMetadataId, + allFlatEntityMaps, + workspaceId, + applicationId, +}: { + universalFlatIndexMetadata: UniversalFlatIndexMetadata; + indexMetadataId: string; + allFlatEntityMaps: AllFlatEntityMaps; + workspaceId: string; + applicationId: string; +}): FlatIndexMetadata => { + const objectMetadata = findFlatEntityByUniversalIdentifier({ + flatEntityMaps: allFlatEntityMaps.flatObjectMetadataMaps, + universalIdentifier: + universalFlatIndexMetadata.objectMetadataUniversalIdentifier, + }); + + if (!isDefined(objectMetadata)) { + throw new FlatEntityMapsException( + `Could not resolve objectMetadataUniversalIdentifier to objectMetadataId: no objectMetadata found for universal identifier ${universalFlatIndexMetadata.objectMetadataUniversalIdentifier}`, + FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND, + ); + } + + const now = new Date().toISOString(); + + const flatIndexFieldMetadatas = + universalFlatIndexMetadata.universalFlatIndexFieldMetadatas.map( + (universalFlatIndexFieldMetadata) => { + const fieldMetadata = findFlatEntityByUniversalIdentifier({ + flatEntityMaps: allFlatEntityMaps.flatFieldMetadataMaps, + universalIdentifier: + universalFlatIndexFieldMetadata.fieldMetadataUniversalIdentifier, + }); + + if (!isDefined(fieldMetadata)) { + throw new FlatEntityMapsException( + `Could not resolve fieldMetadataUniversalIdentifier to fieldMetadataId: no fieldMetadata found for universal identifier ${universalFlatIndexFieldMetadata.fieldMetadataUniversalIdentifier}`, + FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND, + ); + } + + return { + id: v4(), + indexMetadataId, + fieldMetadataId: fieldMetadata.id, + order: universalFlatIndexFieldMetadata.order, + createdAt: now, + updatedAt: now, + }; + }, + ); + + return { + id: indexMetadataId, + universalFlatIndexFieldMetadatas: + universalFlatIndexMetadata.universalFlatIndexFieldMetadatas, + universalIdentifier: universalFlatIndexMetadata.universalIdentifier, + applicationId, + applicationUniversalIdentifier: + universalFlatIndexMetadata.applicationUniversalIdentifier, + workspaceId, + objectMetadataId: objectMetadata.id, + objectMetadataUniversalIdentifier: + universalFlatIndexMetadata.objectMetadataUniversalIdentifier, + name: universalFlatIndexMetadata.name, + isCustom: universalFlatIndexMetadata.isCustom, + isUnique: universalFlatIndexMetadata.isUnique, + indexWhereClause: universalFlatIndexMetadata.indexWhereClause, + indexType: universalFlatIndexMetadata.indexType, + createdAt: universalFlatIndexMetadata.createdAt, + updatedAt: universalFlatIndexMetadata.updatedAt, + flatIndexFieldMetadatas, + }; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/update-logic-function-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/update-logic-function-action-handler.service.ts index 4d4dd81510..c06688a9d8 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/update-logic-function-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/update-logic-function-action-handler.service.ts @@ -6,13 +6,18 @@ import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-mana import { FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; import { LogicFunctionException, LogicFunctionExceptionCode, } from 'src/engine/metadata-modules/logic-function/logic-function.exception'; import { FlatLogicFunction } from 'src/engine/metadata-modules/logic-function/types/flat-logic-function.type'; -import { FlatUpdateLogicFunctionAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdateLogicFunctionAction, + UniversalUpdateLogicFunctionAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -28,9 +33,27 @@ export class UpdateLogicFunctionActionHandlerService extends WorkspaceMigrationR } override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatLogicFunction = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatLogicFunctionMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'logicFunction', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'logicFunction', + entityId: flatLogicFunction.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/navigation-menu-item/services/update-navigation-menu-item-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/navigation-menu-item/services/update-navigation-menu-item-action-handler.service.ts index 854fc9a107..bd26d946a4 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/navigation-menu-item/services/update-navigation-menu-item-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/navigation-menu-item/services/update-navigation-menu-item-action-handler.service.ts @@ -2,8 +2,13 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { NavigationMenuItemEntity } from 'src/engine/metadata-modules/navigation-menu-item/entities/navigation-menu-item.entity'; -import { FlatUpdateNavigationMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdateNavigationMenuItemAction, + UniversalUpdateNavigationMenuItemAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -15,9 +20,27 @@ export class UpdateNavigationMenuItemActionHandlerService extends WorkspaceMigra 'navigationMenuItem', ) { override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatNavigationMenuItem = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatNavigationMenuItemMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'navigationMenuItem', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'navigationMenuItem', + entityId: flatNavigationMenuItem.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/update-object-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/update-object-action-handler.service.ts index 84cc105e44..ca3ce0daee 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/update-object-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/update-object-action-handler.service.ts @@ -4,8 +4,14 @@ import { isDefined } from 'twenty-shared/utils'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { + FlatEntityMapsException, + FlatEntityMapsExceptionCode, +} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; +import { FlatEntityUpdate } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-update.type'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { isCompositeFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util'; import { isEnumFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util'; @@ -49,14 +55,35 @@ export class UpdateObjectActionHandlerService extends WorkspaceMigrationRunnerAc universalIdentifier: action.universalIdentifier, }); - // TODO: transpile updates universal identifiers when builder has been migrated - // For now, updates only contain flat entity diff properties (already IDs, not universal identifiers) + // TODO remove once https://github.com/twentyhq/core-team-issues/issues/2172 has been resolved + const { labelIdentifierFieldMetadataUniversalIdentifier, ...restUpdate } = + action.update; + + const transpiledUpdate: FlatEntityUpdate<'objectMetadata'> = { + ...restUpdate, + }; + + if (isDefined(labelIdentifierFieldMetadataUniversalIdentifier)) { + const flatFieldMetadata = findFlatEntityByUniversalIdentifier({ + flatEntityMaps: allFlatEntityMaps.flatFieldMetadataMaps, + universalIdentifier: labelIdentifierFieldMetadataUniversalIdentifier, + }); + + if (!isDefined(flatFieldMetadata)) { + throw new FlatEntityMapsException( + `Could not resolve labelIdentifierFieldMetadataUniversalIdentifier to labelIdentifierFieldMetadataId: no fieldMetadata found for universal identifier ${labelIdentifierFieldMetadataUniversalIdentifier}`, + FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND, + ); + } + + transpiledUpdate.labelIdentifierFieldMetadataId = flatFieldMetadata.id; + } return { type: 'update', metadataName: 'objectMetadata', entityId: flatObjectMetadata.id, - update: action.update, + update: transpiledUpdate, }; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-tab/services/update-page-layout-tab-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-tab/services/update-page-layout-tab-action-handler.service.ts index 68c49845e8..35717d7dc5 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-tab/services/update-page-layout-tab-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-tab/services/update-page-layout-tab-action-handler.service.ts @@ -2,8 +2,13 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { PageLayoutTabEntity } from 'src/engine/metadata-modules/page-layout-tab/entities/page-layout-tab.entity'; -import { FlatUpdatePageLayoutTabAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdatePageLayoutTabAction, + UniversalUpdatePageLayoutTabAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -15,9 +20,27 @@ export class UpdatePageLayoutTabActionHandlerService extends WorkspaceMigrationR 'pageLayoutTab', ) { override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatPageLayoutTab = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatPageLayoutTabMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'pageLayoutTab', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'pageLayoutTab', + entityId: flatPageLayoutTab.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/update-page-layout-widget-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/update-page-layout-widget-action-handler.service.ts index 247503972f..c476af7987 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/update-page-layout-widget-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/update-page-layout-widget-action-handler.service.ts @@ -2,8 +2,14 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { PageLayoutWidgetEntity } from 'src/engine/metadata-modules/page-layout-widget/entities/page-layout-widget.entity'; -import { FlatUpdatePageLayoutWidgetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdatePageLayoutWidgetAction, + UniversalUpdatePageLayoutWidgetAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type'; +import { fromUniversalConfigurationToFlatPageLayoutWidgetConfiguration } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/utils/from-universal-configuration-to-flat-page-layout-widget-configuration.util'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -19,9 +25,40 @@ export class UpdatePageLayoutWidgetActionHandlerService extends WorkspaceMigrati } override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatPageLayoutWidget = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatPageLayoutWidgetMaps, + universalIdentifier: action.universalIdentifier, + }); + + const { universalConfiguration, ...updateWithResolvedForeignKeys } = + resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'pageLayoutWidget', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + const update = + universalConfiguration === undefined + ? updateWithResolvedForeignKeys + : { + ...updateWithResolvedForeignKeys, + configuration: + fromUniversalConfigurationToFlatPageLayoutWidgetConfiguration({ + universalConfiguration, + flatFieldMetadataMaps: allFlatEntityMaps.flatFieldMetadataMaps, + }), + }; + + return { + type: 'update', + metadataName: 'pageLayoutWidget', + entityId: flatPageLayoutWidget.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/utils/from-universal-configuration-to-flat-page-layout-widget-configuration.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/utils/from-universal-configuration-to-flat-page-layout-widget-configuration.util.ts new file mode 100644 index 0000000000..1b7540f0ce --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/utils/from-universal-configuration-to-flat-page-layout-widget-configuration.util.ts @@ -0,0 +1,216 @@ +import { isDefined } from 'twenty-shared/utils'; + +import { + FlatEntityMapsException, + FlatEntityMapsExceptionCode, +} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; +import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; +import { type FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type'; +import { WidgetConfigurationType } from 'src/engine/metadata-modules/page-layout-widget/enums/widget-configuration-type.type'; + +const resolveFieldMetadataIdOrThrow = ({ + fieldMetadataUniversalIdentifier, + flatFieldMetadataMaps, +}: { + fieldMetadataUniversalIdentifier: string | null; + flatFieldMetadataMaps: MetadataFlatEntityMaps<'fieldMetadata'>; +}): string => { + if (!isDefined(fieldMetadataUniversalIdentifier)) { + throw new FlatEntityMapsException( + `Could not found any field metadata universal identifier while resolving page layout widget`, + FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND, + ); + } + + const flatFieldMetadata = findFlatEntityByUniversalIdentifier({ + flatEntityMaps: flatFieldMetadataMaps, + universalIdentifier: fieldMetadataUniversalIdentifier, + }); + + if (!isDefined(flatFieldMetadata)) { + throw new FlatEntityMapsException( + `Field metadata not found for universal identifier: ${fieldMetadataUniversalIdentifier}`, + FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND, + ); + } + + return flatFieldMetadata.id; +}; + +export const fromUniversalConfigurationToFlatPageLayoutWidgetConfiguration = ({ + universalConfiguration, + flatFieldMetadataMaps, +}: { + universalConfiguration: FlatPageLayoutWidget['universalConfiguration']; + flatFieldMetadataMaps: MetadataFlatEntityMaps<'fieldMetadata'>; +}): FlatPageLayoutWidget['configuration'] => { + switch (universalConfiguration.configurationType) { + case WidgetConfigurationType.AGGREGATE_CHART: { + const { + aggregateFieldMetadataUniversalIdentifier, + ratioAggregateConfig: universalRatioAggregateConfig, + ...rest + } = universalConfiguration; + + const aggregateFieldMetadataId = resolveFieldMetadataIdOrThrow({ + fieldMetadataUniversalIdentifier: + aggregateFieldMetadataUniversalIdentifier, + flatFieldMetadataMaps, + }); + + const ratioAggregateConfig = isDefined(universalRatioAggregateConfig) + ? { + optionValue: universalRatioAggregateConfig.optionValue, + fieldMetadataId: resolveFieldMetadataIdOrThrow({ + fieldMetadataUniversalIdentifier: + universalRatioAggregateConfig.fieldMetadataUniversalIdentifier, + flatFieldMetadataMaps, + }), + } + : undefined; + + return { + ...rest, + aggregateFieldMetadataId, + ratioAggregateConfig, + }; + } + + case WidgetConfigurationType.GAUGE_CHART: { + const { aggregateFieldMetadataUniversalIdentifier, ...rest } = + universalConfiguration; + + const aggregateFieldMetadataId = resolveFieldMetadataIdOrThrow({ + fieldMetadataUniversalIdentifier: + aggregateFieldMetadataUniversalIdentifier, + flatFieldMetadataMaps, + }); + + return { + ...rest, + aggregateFieldMetadataId, + }; + } + + case WidgetConfigurationType.PIE_CHART: { + const { + aggregateFieldMetadataUniversalIdentifier, + groupByFieldMetadataUniversalIdentifier, + ...rest + } = universalConfiguration; + + const aggregateFieldMetadataId = resolveFieldMetadataIdOrThrow({ + fieldMetadataUniversalIdentifier: + aggregateFieldMetadataUniversalIdentifier, + flatFieldMetadataMaps, + }); + + const groupByFieldMetadataId = resolveFieldMetadataIdOrThrow({ + fieldMetadataUniversalIdentifier: + groupByFieldMetadataUniversalIdentifier, + flatFieldMetadataMaps, + }); + + return { + ...rest, + aggregateFieldMetadataId, + groupByFieldMetadataId, + }; + } + + case WidgetConfigurationType.BAR_CHART: { + const { + aggregateFieldMetadataUniversalIdentifier, + primaryAxisGroupByFieldMetadataUniversalIdentifier, + secondaryAxisGroupByFieldMetadataUniversalIdentifier, + ...rest + } = universalConfiguration; + + const aggregateFieldMetadataId = resolveFieldMetadataIdOrThrow({ + fieldMetadataUniversalIdentifier: + aggregateFieldMetadataUniversalIdentifier, + flatFieldMetadataMaps, + }); + + const primaryAxisGroupByFieldMetadataId = resolveFieldMetadataIdOrThrow({ + fieldMetadataUniversalIdentifier: + primaryAxisGroupByFieldMetadataUniversalIdentifier, + flatFieldMetadataMaps, + }); + + const secondaryAxisGroupByFieldMetadataId = isDefined( + secondaryAxisGroupByFieldMetadataUniversalIdentifier, + ) + ? resolveFieldMetadataIdOrThrow({ + fieldMetadataUniversalIdentifier: + secondaryAxisGroupByFieldMetadataUniversalIdentifier, + flatFieldMetadataMaps, + }) + : undefined; + + return { + ...rest, + aggregateFieldMetadataId, + primaryAxisGroupByFieldMetadataId, + secondaryAxisGroupByFieldMetadataId, + }; + } + + case WidgetConfigurationType.LINE_CHART: { + const { + aggregateFieldMetadataUniversalIdentifier, + primaryAxisGroupByFieldMetadataUniversalIdentifier, + secondaryAxisGroupByFieldMetadataUniversalIdentifier, + ...rest + } = universalConfiguration; + + const aggregateFieldMetadataId = resolveFieldMetadataIdOrThrow({ + fieldMetadataUniversalIdentifier: + aggregateFieldMetadataUniversalIdentifier, + flatFieldMetadataMaps, + }); + + const primaryAxisGroupByFieldMetadataId = resolveFieldMetadataIdOrThrow({ + fieldMetadataUniversalIdentifier: + primaryAxisGroupByFieldMetadataUniversalIdentifier, + flatFieldMetadataMaps, + }); + + const secondaryAxisGroupByFieldMetadataId = isDefined( + secondaryAxisGroupByFieldMetadataUniversalIdentifier, + ) + ? resolveFieldMetadataIdOrThrow({ + fieldMetadataUniversalIdentifier: + secondaryAxisGroupByFieldMetadataUniversalIdentifier, + flatFieldMetadataMaps, + }) + : undefined; + + return { + ...rest, + aggregateFieldMetadataId, + primaryAxisGroupByFieldMetadataId, + secondaryAxisGroupByFieldMetadataId, + }; + } + + case WidgetConfigurationType.VIEW: + case WidgetConfigurationType.FIELD: + case WidgetConfigurationType.FIELDS: + case WidgetConfigurationType.TIMELINE: + case WidgetConfigurationType.TASKS: + case WidgetConfigurationType.NOTES: + case WidgetConfigurationType.FILES: + case WidgetConfigurationType.EMAILS: + case WidgetConfigurationType.CALENDAR: + case WidgetConfigurationType.FIELD_RICH_TEXT: + case WidgetConfigurationType.WORKFLOW: + case WidgetConfigurationType.WORKFLOW_VERSION: + case WidgetConfigurationType.WORKFLOW_RUN: + case WidgetConfigurationType.FRONT_COMPONENT: + case WidgetConfigurationType.IFRAME: + case WidgetConfigurationType.STANDALONE_RICH_TEXT: + return universalConfiguration; + } +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout/services/update-page-layout-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout/services/update-page-layout-action-handler.service.ts index 0a2a478cf9..4bff4dd810 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout/services/update-page-layout-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout/services/update-page-layout-action-handler.service.ts @@ -2,8 +2,13 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { PageLayoutEntity } from 'src/engine/metadata-modules/page-layout/entities/page-layout.entity'; -import { FlatUpdatePageLayoutAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdatePageLayoutAction, + UniversalUpdatePageLayoutAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -15,9 +20,27 @@ export class UpdatePageLayoutActionHandlerService extends WorkspaceMigrationRunn 'pageLayout', ) { override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatPageLayout = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatPageLayoutMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'pageLayout', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'pageLayout', + entityId: flatPageLayout.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role-target/services/update-role-target-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role-target/services/update-role-target-action-handler.service.ts index 5f0741b2ae..1abe99d98a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role-target/services/update-role-target-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role-target/services/update-role-target-action-handler.service.ts @@ -2,8 +2,13 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { RoleTargetEntity } from 'src/engine/metadata-modules/role-target/role-target.entity'; -import { FlatUpdateRoleTargetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdateRoleTargetAction, + UniversalUpdateRoleTargetAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -19,9 +24,27 @@ export class UpdateRoleTargetActionHandlerService extends WorkspaceMigrationRunn } override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatRoleTarget = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatRoleTargetMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'roleTarget', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'roleTarget', + entityId: flatRoleTarget.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role/services/update-role-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role/services/update-role-action-handler.service.ts index f0823548ce..c1138bee64 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role/services/update-role-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role/services/update-role-action-handler.service.ts @@ -2,8 +2,13 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity'; -import { FlatUpdateRoleAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdateRoleAction, + UniversalUpdateRoleAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -15,9 +20,27 @@ export class UpdateRoleActionHandlerService extends WorkspaceMigrationRunnerActi 'role', ) { override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatRole = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatRoleMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'role', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'role', + entityId: flatRole.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate-group/services/update-row-level-permission-predicate-group-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate-group/services/update-row-level-permission-predicate-group-action-handler.service.ts index 1377ce2000..6b1210413b 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate-group/services/update-row-level-permission-predicate-group-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate-group/services/update-row-level-permission-predicate-group-action-handler.service.ts @@ -4,8 +4,13 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { RowLevelPermissionPredicateGroupEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate-group.entity'; -import { FlatUpdateRowLevelPermissionPredicateGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdateRowLevelPermissionPredicateGroupAction, + UniversalUpdateRowLevelPermissionPredicateGroupAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -17,9 +22,29 @@ export class UpdateRowLevelPermissionPredicateGroupActionHandlerService extends 'rowLevelPermissionPredicateGroup', ) { override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatRowLevelPermissionPredicateGroup = + findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: + allFlatEntityMaps.flatRowLevelPermissionPredicateGroupMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'rowLevelPermissionPredicateGroup', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'rowLevelPermissionPredicateGroup', + entityId: flatRowLevelPermissionPredicateGroup.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate/services/update-row-level-permission-predicate-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate/services/update-row-level-permission-predicate-action-handler.service.ts index 562f386b77..806d7ec8df 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate/services/update-row-level-permission-predicate-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate/services/update-row-level-permission-predicate-action-handler.service.ts @@ -4,8 +4,13 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { RowLevelPermissionPredicateEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate.entity'; -import { FlatUpdateRowLevelPermissionPredicateAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdateRowLevelPermissionPredicateAction, + UniversalUpdateRowLevelPermissionPredicateAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -17,9 +22,28 @@ export class UpdateRowLevelPermissionPredicateActionHandlerService extends Works 'rowLevelPermissionPredicate', ) { override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatRowLevelPermissionPredicate = + findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatRowLevelPermissionPredicateMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'rowLevelPermissionPredicate', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'rowLevelPermissionPredicate', + entityId: flatRowLevelPermissionPredicate.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/create-skill-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/create-skill-action-handler.service.ts index b10022dcf3..344956c3e5 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/create-skill-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/create-skill-action-handler.service.ts @@ -1,9 +1,14 @@ import { Injectable } from '@nestjs/common'; +import { v4 } from 'uuid'; + import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { SkillEntity } from 'src/engine/metadata-modules/skill/entities/skill.entity'; -import { FlatCreateSkillAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type'; +import { + FlatCreateSkillAction, + UniversalCreateSkillAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -18,10 +23,20 @@ export class CreateSkillActionHandlerService extends WorkspaceMigrationRunnerAct super(); } - override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - return context.action; + override async transpileUniversalActionToFlatAction({ + action, + flatApplication, + workspaceId, + }: WorkspaceMigrationActionRunnerArgs): Promise { + return { + ...action, + flatEntity: { + ...action.flatEntity, + applicationId: flatApplication.id, + id: action.id ?? v4(), + workspaceId, + }, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/update-skill-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/update-skill-action-handler.service.ts index 41341afaff..a4774be289 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/update-skill-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/update-skill-action-handler.service.ts @@ -2,8 +2,13 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { SkillEntity } from 'src/engine/metadata-modules/skill/entities/skill.entity'; -import { FlatUpdateSkillAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdateSkillAction, + UniversalUpdateSkillAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -15,9 +20,27 @@ export class UpdateSkillActionHandlerService extends WorkspaceMigrationRunnerAct 'skill', ) { override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatSkill = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatSkillMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'skill', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'skill', + entityId: flatSkill.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/create-view-field-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/create-view-field-action-handler.service.ts index aa5fbbec02..aa0554763a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/create-view-field-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/create-view-field-action-handler.service.ts @@ -1,9 +1,15 @@ import { Injectable } from '@nestjs/common'; +import { v4 } from 'uuid'; + import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; -import { FlatCreateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type'; +import { resolveUniversalRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-relation-identifiers-to-ids.util'; +import { + FlatCreateViewFieldAction, + UniversalCreateViewFieldAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -18,10 +24,30 @@ export class CreateViewFieldActionHandlerService extends WorkspaceMigrationRunne super(); } - override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - return context.action; + override async transpileUniversalActionToFlatAction({ + action, + allFlatEntityMaps, + flatApplication, + workspaceId, + }: WorkspaceMigrationActionRunnerArgs): Promise { + const { fieldMetadataId, viewId } = + resolveUniversalRelationIdentifiersToIds({ + flatEntityMaps: allFlatEntityMaps, + metadataName: action.metadataName, + universalForeignKeyValues: action.flatEntity, + }); + + return { + ...action, + flatEntity: { + ...action.flatEntity, + fieldMetadataId, + viewId, + id: action.id ?? v4(), + applicationId: flatApplication.id, + workspaceId, + }, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/update-view-field-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/update-view-field-action-handler.service.ts index 3c531377ff..89c7bf5369 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/update-view-field-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/update-view-field-action-handler.service.ts @@ -2,8 +2,13 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; -import { FlatUpdateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdateViewFieldAction, + UniversalUpdateViewFieldAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -19,9 +24,27 @@ export class UpdateViewFieldActionHandlerService extends WorkspaceMigrationRunne } override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatViewField = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatViewFieldMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'viewField', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'viewField', + entityId: flatViewField.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/create-view-filter-group-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/create-view-filter-group-action-handler.service.ts index 1f51dcbdbb..8b1126ac2d 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/create-view-filter-group-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/create-view-filter-group-action-handler.service.ts @@ -1,9 +1,15 @@ import { Injectable } from '@nestjs/common'; +import { v4 } from 'uuid'; + import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { ViewFilterGroupEntity } from 'src/engine/metadata-modules/view-filter-group/entities/view-filter-group.entity'; -import { type FlatCreateViewFilterGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type'; +import { resolveUniversalRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-relation-identifiers-to-ids.util'; +import { + type FlatCreateViewFilterGroupAction, + type UniversalCreateViewFilterGroupAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type'; import { type WorkspaceMigrationActionRunnerArgs, type WorkspaceMigrationActionRunnerContext, @@ -14,10 +20,32 @@ export class CreateViewFilterGroupActionHandlerService extends WorkspaceMigratio 'create', 'viewFilterGroup', ) { - override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - return context.action; + override async transpileUniversalActionToFlatAction({ + action, + allFlatEntityMaps, + flatApplication, + workspaceId, + }: WorkspaceMigrationActionRunnerArgs): Promise { + const { parentViewFilterGroupId, viewId } = + resolveUniversalRelationIdentifiersToIds({ + flatEntityMaps: allFlatEntityMaps, + metadataName: action.metadataName, + universalForeignKeyValues: action.flatEntity, + }); + + return { + ...action, + flatEntity: { + ...action.flatEntity, + parentViewFilterGroupId, + viewId, + id: action.id ?? v4(), + applicationId: flatApplication.id, + workspaceId, + childViewFilterGroupIds: [], + viewFilterIds: [], + }, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/update-view-filter-group-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/update-view-filter-group-action-handler.service.ts index 017f3cab67..27f43d8842 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/update-view-filter-group-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/update-view-filter-group-action-handler.service.ts @@ -2,8 +2,13 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { ViewFilterGroupEntity } from 'src/engine/metadata-modules/view-filter-group/entities/view-filter-group.entity'; -import { type FlatUpdateViewFilterGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + type FlatUpdateViewFilterGroupAction, + type UniversalUpdateViewFilterGroupAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type'; import { type WorkspaceMigrationActionRunnerArgs, type WorkspaceMigrationActionRunnerContext, @@ -19,9 +24,27 @@ export class UpdateViewFilterGroupActionHandlerService extends WorkspaceMigratio } override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatViewFilterGroup = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatViewFilterGroupMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'viewFilterGroup', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'viewFilterGroup', + entityId: flatViewFilterGroup.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/create-view-filter-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/create-view-filter-action-handler.service.ts index d7a8c94d95..8666631e5e 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/create-view-filter-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/create-view-filter-action-handler.service.ts @@ -1,9 +1,15 @@ import { Injectable } from '@nestjs/common'; +import { v4 } from 'uuid'; + import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; -import { FlatCreateViewFilterAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type'; +import { resolveUniversalRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-relation-identifiers-to-ids.util'; +import { + FlatCreateViewFilterAction, + UniversalCreateViewFilterAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -14,10 +20,31 @@ export class CreateViewFilterActionHandlerService extends WorkspaceMigrationRunn 'create', 'viewFilter', ) { - override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - return context.action; + override async transpileUniversalActionToFlatAction({ + action, + allFlatEntityMaps, + flatApplication, + workspaceId, + }: WorkspaceMigrationActionRunnerArgs): Promise { + const { fieldMetadataId, viewId, viewFilterGroupId } = + resolveUniversalRelationIdentifiersToIds({ + flatEntityMaps: allFlatEntityMaps, + metadataName: action.metadataName, + universalForeignKeyValues: action.flatEntity, + }); + + return { + ...action, + flatEntity: { + ...action.flatEntity, + fieldMetadataId, + viewId, + viewFilterGroupId, + id: action.id ?? v4(), + applicationId: flatApplication.id, + workspaceId, + }, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/update-view-filter-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/update-view-filter-action-handler.service.ts index 7faac54ac5..e744637963 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/update-view-filter-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/update-view-filter-action-handler.service.ts @@ -2,8 +2,13 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; -import { FlatUpdateViewFilterAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdateViewFilterAction, + UniversalUpdateViewFilterAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -19,9 +24,27 @@ export class UpdateViewFilterActionHandlerService extends WorkspaceMigrationRunn } override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatViewFilter = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatViewFilterMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'viewFilter', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'viewFilter', + entityId: flatViewFilter.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/create-view-group-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/create-view-group-action-handler.service.ts index 69bd2f8fdc..ea0cf64215 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/create-view-group-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/create-view-group-action-handler.service.ts @@ -1,9 +1,15 @@ import { Injectable } from '@nestjs/common'; +import { v4 } from 'uuid'; + import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; -import { FlatCreateViewGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type'; +import { resolveUniversalRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-relation-identifiers-to-ids.util'; +import { + FlatCreateViewGroupAction, + UniversalCreateViewGroupAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -14,10 +20,28 @@ export class CreateViewGroupActionHandlerService extends WorkspaceMigrationRunne 'create', 'viewGroup', ) { - override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - return context.action; + override async transpileUniversalActionToFlatAction({ + action, + allFlatEntityMaps, + flatApplication, + workspaceId, + }: WorkspaceMigrationActionRunnerArgs): Promise { + const { viewId } = resolveUniversalRelationIdentifiersToIds({ + flatEntityMaps: allFlatEntityMaps, + metadataName: action.metadataName, + universalForeignKeyValues: action.flatEntity, + }); + + return { + ...action, + flatEntity: { + ...action.flatEntity, + viewId, + id: action.id ?? v4(), + applicationId: flatApplication.id, + workspaceId, + }, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/update-view-group-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/update-view-group-action-handler.service.ts index 484f58ebf3..52d2fd7432 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/update-view-group-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/update-view-group-action-handler.service.ts @@ -2,8 +2,13 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; -import { FlatUpdateViewGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdateViewGroupAction, + UniversalUpdateViewGroupAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -15,9 +20,27 @@ export class UpdateViewGroupActionHandlerService extends WorkspaceMigrationRunne 'viewGroup', ) { override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatViewGroup = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatViewGroupMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'viewGroup', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'viewGroup', + entityId: flatViewGroup.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/create-view-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/create-view-action-handler.service.ts index adc76bdf31..6c824eb388 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/create-view-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/create-view-action-handler.service.ts @@ -1,9 +1,15 @@ import { Injectable } from '@nestjs/common'; +import { v4 } from 'uuid'; + import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; -import { FlatCreateViewAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type'; +import { resolveUniversalRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-relation-identifiers-to-ids.util'; +import { + FlatCreateViewAction, + UniversalCreateViewAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -18,10 +24,40 @@ export class CreateViewActionHandlerService extends WorkspaceMigrationRunnerActi super(); } - override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - return context.action; + override async transpileUniversalActionToFlatAction({ + action, + allFlatEntityMaps, + flatApplication, + workspaceId, + }: WorkspaceMigrationActionRunnerArgs): Promise { + const { + calendarFieldMetadataId, + kanbanAggregateOperationFieldMetadataId, + mainGroupByFieldMetadataId, + objectMetadataId, + } = resolveUniversalRelationIdentifiersToIds({ + flatEntityMaps: allFlatEntityMaps, + metadataName: action.metadataName, + universalForeignKeyValues: action.flatEntity, + }); + + return { + ...action, + flatEntity: { + ...action.flatEntity, + calendarFieldMetadataId, + kanbanAggregateOperationFieldMetadataId, + mainGroupByFieldMetadataId, + objectMetadataId, + id: action.id ?? v4(), + applicationId: flatApplication.id, + workspaceId, + viewFieldIds: [], + viewGroupIds: [], + viewFilterIds: [], + viewFilterGroupIds: [], + }, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/update-view-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/update-view-action-handler.service.ts index 73850eadf7..91fc222a69 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/update-view-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/update-view-action-handler.service.ts @@ -2,8 +2,13 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; -import { FlatUpdateViewAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdateViewAction, + UniversalUpdateViewAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -19,9 +24,27 @@ export class UpdateViewActionHandlerService extends WorkspaceMigrationRunnerActi } override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatView = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatViewMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'view', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'view', + entityId: flatView.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/webhook/services/update-webhook-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/webhook/services/update-webhook-action-handler.service.ts index 5dee5b284c..422646e6de 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/webhook/services/update-webhook-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/webhook/services/update-webhook-action-handler.service.ts @@ -2,8 +2,13 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { WebhookEntity } from 'src/engine/metadata-modules/webhook/entities/webhook.entity'; -import { FlatUpdateWebhookAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type'; +import { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util'; +import { + FlatUpdateWebhookAction, + UniversalUpdateWebhookAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -15,9 +20,27 @@ export class UpdateWebhookActionHandlerService extends WorkspaceMigrationRunnerA 'webhook', ) { override async transpileUniversalActionToFlatAction( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise { - return context.action; + const { action, allFlatEntityMaps } = context; + + const flatWebhook = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatWebhookMaps, + universalIdentifier: action.universalIdentifier, + }); + + const update = resolveUniversalUpdateRelationIdentifiersToIds({ + metadataName: 'webhook', + universalUpdate: action.update, + allFlatEntityMaps, + }); + + return { + type: 'update', + metadataName: 'webhook', + entityId: flatWebhook.id, + update, + }; } async executeForMetadata( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface.ts index 865eb72deb..3adafdf891 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface.ts @@ -6,13 +6,14 @@ import { LoggerService } from 'src/engine/core-modules/logger/logger.service'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { AllFlatEntityTypesByMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name'; import { FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { FlatEntityUpdate } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type'; import { MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; import { MetadataRelatedFlatEntityMapsKeys } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-flat-entity-maps-keys.type'; import { MetadataToFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/types/metadata-to-flat-entity-maps-key'; import { WorkspaceMigrationActionType } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type'; import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; +import { UniversalFlatEntityUpdate } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-update.type'; +import { sanitizeUniversalFlatEntityUpdate } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/sanitize-universal-flat-entity-update.util'; import { BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { buildActionHandlerKey, @@ -31,7 +32,6 @@ import { import { optimisticallyApplyCreateActionOnAllFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-create-action-on-all-flat-entity-maps.util'; import { optimisticallyApplyDeleteActionOnAllFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-delete-action-on-all-flat-entity-maps.util'; import { optimisticallyApplyUpdateActionOnAllFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-update-action-on-all-flat-entity-maps.util'; -import { sanitizeFlatEntityUpdate } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/sanitize-flat-entity-update.util'; type OptimisticallyApplyActionOnAllFlatEntityMapsArgs< TFlatAction extends AllFlatWorkspaceMigrationAction, @@ -137,9 +137,9 @@ export abstract class BaseWorkspaceMigrationRunnerActionHandlerService< universalAction: TUniversalAction, ): TUniversalAction { if (universalAction.type === 'update') { - const sanitizedFlatEntityUpdate = sanitizeFlatEntityUpdate({ + const sanitizedFlatEntityUpdate = sanitizeUniversalFlatEntityUpdate({ metadataName: universalAction.metadataName, - flatEntityUpdate: universalAction.update as FlatEntityUpdate< + flatEntityUpdate: universalAction.update as UniversalFlatEntityUpdate< typeof universalAction.metadataName >, }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/services/workspace-migration-runner.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/services/workspace-migration-runner.service.ts index 28c2b40c47..42f57daefb 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/services/workspace-migration-runner.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/services/workspace-migration-runner.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; import { InjectDataSource } from '@nestjs/typeorm'; -import { AllMetadataName } from 'twenty-shared/metadata'; +import { type AllMetadataName } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; import { DataSource } from 'typeorm'; @@ -10,6 +10,7 @@ import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadat import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; import { getMetadataRelatedMetadataNames } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-related-metadata-names.util'; +import { getMetadataSerializedRelationNames } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-serialized-relation-names.util'; import { FIND_ALL_CORE_VIEWS_GRAPHQL_OPERATION } from 'src/engine/metadata-modules/view/constants/find-all-core-views-graphql-operation.constant'; import { WorkspaceMetadataVersionService } from 'src/engine/metadata-modules/workspace-metadata-version/services/workspace-metadata-version.service'; import { WorkspaceCacheStorageService } from 'src/engine/workspace-cache-storage/workspace-cache-storage.service'; @@ -163,6 +164,7 @@ export class WorkspaceMigrationRunnerService { ...new Set([ ...actionMetadataNames, ...actionMetadataNames.flatMap(getMetadataRelatedMetadataNames), + ...actionMetadataNames.flatMap(getMetadataSerializedRelationNames), ]), ]; const allFlatEntityMapsKeys = actionsMetadataAndRelatedMetadataNames.map( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-update-action-on-all-flat-entity-maps.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-update-action-on-all-flat-entity-maps.util.ts index 3723013207..d5086b46cd 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-update-action-on-all-flat-entity-maps.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-update-action-on-all-flat-entity-maps.util.ts @@ -40,7 +40,7 @@ export const optimisticallyApplyUpdateActionOnAllFlatEntityMaps = < }); addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow({ - flatEntity: flatAction.updatedFlatEntity, + flatEntity: flatAction.updatedFlatIndex, flatEntityAndRelatedMapsToMutate: allFlatEntityMaps, metadataName: flatAction.metadataName, }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/sanitize-flat-entity-update.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/sanitize-flat-entity-update.util.ts deleted file mode 100644 index cb369f3c71..0000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/sanitize-flat-entity-update.util.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { type AllMetadataName } from 'twenty-shared/metadata'; - -import { ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY } from 'src/engine/metadata-modules/flat-entity/constant/all-flat-entity-properties-to-compare-and-stringify.constant'; -import { - type FlatEntityUpdate, - type MetadataFlatEntityComparableProperties, -} from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type'; - -export const sanitizeFlatEntityUpdate = ({ - flatEntityUpdate, - metadataName, -}: { - flatEntityUpdate: FlatEntityUpdate; - metadataName: T; -}): FlatEntityUpdate => { - const { propertiesToCompare } = - ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY[metadataName]; - - const initialAccumulator: FlatEntityUpdate = {}; - - return propertiesToCompare.reduce((accumulator, property) => { - const updatedValue = - flatEntityUpdate[property as MetadataFlatEntityComparableProperties]; - - if (updatedValue === undefined) { - return accumulator; - } - - return { - ...accumulator, - [property]: updatedValue, - }; - }, initialAccumulator); -}; diff --git a/packages/twenty-server/test/integration/constants/widget-configuration-test-data.constants.ts b/packages/twenty-server/test/integration/constants/widget-configuration-test-data.constants.ts index 6b024fa090..77cc8ae093 100644 --- a/packages/twenty-server/test/integration/constants/widget-configuration-test-data.constants.ts +++ b/packages/twenty-server/test/integration/constants/widget-configuration-test-data.constants.ts @@ -11,16 +11,23 @@ import { BarChartLayout } from 'src/engine/metadata-modules/page-layout-widget/e import { GraphOrderBy } from 'src/engine/metadata-modules/page-layout-widget/enums/graph-order-by.enum'; import { WidgetConfigurationType } from 'src/engine/metadata-modules/page-layout-widget/enums/widget-configuration-type.type'; -export const TEST_FIELD_METADATA_ID_1 = '20202020-1111-4111-a111-111111111111'; -export const TEST_FIELD_METADATA_ID_2 = '20202020-2222-4222-a222-222222222222'; -export const TEST_FIELD_METADATA_ID_3 = '20202020-3333-4333-a333-333333333333'; -export const TEST_FIELD_METADATA_ID_4 = '20202020-4444-4444-a444-444444444444'; +// Hardcoded UUIDs for unit tests only (no DB lookup needed) +const UNIT_TEST_FIELD_METADATA_ID_1 = '20202020-1111-4111-a111-111111111111'; +const UNIT_TEST_FIELD_METADATA_ID_2 = '20202020-2222-4222-a222-222222222222'; +const UNIT_TEST_FIELD_METADATA_ID_3 = '20202020-3333-4333-a333-333333333333'; + +// --- Static configs (no field metadata IDs) --- export const TEST_IFRAME_CONFIG: IframeConfigurationDTO = { configurationType: WidgetConfigurationType.IFRAME, url: 'https://example.com/dashboard', }; +export const TEST_IFRAME_CONFIG_ALTERNATIVE: IframeConfigurationDTO = { + configurationType: WidgetConfigurationType.IFRAME, + url: 'https://app.twenty.com/analytics', +}; + export const TEST_STANDALONE_RICH_TEXT_CONFIG: StandaloneRichTextConfigurationDTO = { configurationType: WidgetConfigurationType.STANDALONE_RICH_TEXT, @@ -39,164 +46,14 @@ export const TEST_STANDALONE_RICH_TEXT_CONFIG_MINIMAL: StandaloneRichTextConfigu }, }; +// --- Invalid configs (for failure test cases) --- + export const INVALID_STANDALONE_RICH_TEXT_CONFIG_MISSING_BODY = {}; export const INVALID_STANDALONE_RICH_TEXT_CONFIG_BODY_WRONG_TYPE = { body: 'not an object', }; -export const INVALID_STANDALONE_RICH_TEXT_CONFIG_INVALID_SUBFIELDS = { - configurationType: WidgetConfigurationType.STANDALONE_RICH_TEXT, - body: { - blocknote: 'valid', - markdown: 'valid', - invalidField: 'should not be here', - }, -}; - -export const TEST_IFRAME_CONFIG_ALTERNATIVE: IframeConfigurationDTO = { - configurationType: WidgetConfigurationType.IFRAME, - url: 'https://app.twenty.com/analytics', -}; - -export const TEST_NUMBER_CHART_CONFIG: AggregateChartConfigurationDTO = { - configurationType: WidgetConfigurationType.AGGREGATE_CHART, - aggregateFieldMetadataId: TEST_FIELD_METADATA_ID_1, - aggregateOperation: AggregateOperations.COUNT, - label: 'Total Records', - description: 'Count of all records', - format: '0,0', - displayDataLabel: true, -}; - -export const TEST_NUMBER_CHART_CONFIG_MINIMAL: AggregateChartConfigurationDTO = - { - configurationType: WidgetConfigurationType.AGGREGATE_CHART, - aggregateFieldMetadataId: TEST_FIELD_METADATA_ID_1, - aggregateOperation: AggregateOperations.SUM, - displayDataLabel: false, - }; - -export const TEST_VERTICAL_BAR_CHART_CONFIG: BarChartConfigurationDTO = { - configurationType: WidgetConfigurationType.BAR_CHART, - layout: BarChartLayout.VERTICAL, - aggregateFieldMetadataId: TEST_FIELD_METADATA_ID_1, - aggregateOperation: AggregateOperations.SUM, - primaryAxisGroupByFieldMetadataId: TEST_FIELD_METADATA_ID_2, - primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, - displayDataLabel: true, - axisNameDisplay: AxisNameDisplay.NONE, - color: 'red', - description: 'Monthly revenue breakdown', - omitNullValues: true, - rangeMin: 0, - rangeMax: 100000, -}; - -export const TEST_VERTICAL_BAR_CHART_CONFIG_MINIMAL: BarChartConfigurationDTO = - { - configurationType: WidgetConfigurationType.BAR_CHART, - layout: BarChartLayout.VERTICAL, - aggregateFieldMetadataId: TEST_FIELD_METADATA_ID_1, - aggregateOperation: AggregateOperations.COUNT, - primaryAxisGroupByFieldMetadataId: TEST_FIELD_METADATA_ID_2, - primaryAxisOrderBy: GraphOrderBy.VALUE_DESC, - displayDataLabel: false, - axisNameDisplay: AxisNameDisplay.NONE, - }; - -export const TEST_HORIZONTAL_BAR_CHART_CONFIG: BarChartConfigurationDTO = { - configurationType: WidgetConfigurationType.BAR_CHART, - layout: BarChartLayout.HORIZONTAL, - aggregateFieldMetadataId: TEST_FIELD_METADATA_ID_1, - aggregateOperation: AggregateOperations.SUM, - primaryAxisGroupByFieldMetadataId: TEST_FIELD_METADATA_ID_2, - primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, - displayDataLabel: true, - axisNameDisplay: AxisNameDisplay.NONE, - color: 'blue', - description: 'Horizontal revenue breakdown', - omitNullValues: true, - rangeMin: 0, - rangeMax: 100000, -}; - -export const TEST_HORIZONTAL_BAR_CHART_CONFIG_MINIMAL: BarChartConfigurationDTO = - { - configurationType: WidgetConfigurationType.BAR_CHART, - layout: BarChartLayout.HORIZONTAL, - aggregateFieldMetadataId: TEST_FIELD_METADATA_ID_1, - aggregateOperation: AggregateOperations.COUNT, - primaryAxisGroupByFieldMetadataId: TEST_FIELD_METADATA_ID_2, - primaryAxisOrderBy: GraphOrderBy.VALUE_DESC, - displayDataLabel: false, - axisNameDisplay: AxisNameDisplay.NONE, - }; - -export const TEST_LINE_CHART_CONFIG: LineChartConfigurationDTO = { - configurationType: WidgetConfigurationType.LINE_CHART, - aggregateFieldMetadataId: TEST_FIELD_METADATA_ID_1, - aggregateOperation: AggregateOperations.AVG, - primaryAxisGroupByFieldMetadataId: TEST_FIELD_METADATA_ID_2, - primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, - secondaryAxisGroupByFieldMetadataId: TEST_FIELD_METADATA_ID_3, - secondaryAxisOrderBy: GraphOrderBy.FIELD_DESC, - displayDataLabel: true, - axisNameDisplay: AxisNameDisplay.NONE, - color: 'cyan', - description: 'Trend over time', - omitNullValues: false, - rangeMin: -100, - rangeMax: 100, -}; - -export const TEST_LINE_CHART_CONFIG_MINIMAL: LineChartConfigurationDTO = { - configurationType: WidgetConfigurationType.LINE_CHART, - aggregateFieldMetadataId: TEST_FIELD_METADATA_ID_1, - aggregateOperation: AggregateOperations.MAX, - primaryAxisGroupByFieldMetadataId: TEST_FIELD_METADATA_ID_2, - primaryAxisOrderBy: GraphOrderBy.VALUE_ASC, - displayDataLabel: false, - axisNameDisplay: AxisNameDisplay.NONE, -}; - -export const TEST_PIE_CHART_CONFIG: PieChartConfigurationDTO = { - configurationType: WidgetConfigurationType.PIE_CHART, - groupByFieldMetadataId: TEST_FIELD_METADATA_ID_1, - aggregateFieldMetadataId: TEST_FIELD_METADATA_ID_2, - aggregateOperation: AggregateOperations.SUM, - orderBy: GraphOrderBy.VALUE_DESC, - displayDataLabel: true, - displayLegend: true, - showCenterMetric: true, - color: 'yellow', - description: 'Distribution by category', -}; - -export const TEST_PIE_CHART_CONFIG_MINIMAL: PieChartConfigurationDTO = { - configurationType: WidgetConfigurationType.PIE_CHART, - groupByFieldMetadataId: TEST_FIELD_METADATA_ID_1, - aggregateFieldMetadataId: TEST_FIELD_METADATA_ID_2, - aggregateOperation: AggregateOperations.COUNT, - orderBy: GraphOrderBy.FIELD_ASC, - displayDataLabel: false, -}; - -export const TEST_GAUGE_CHART_CONFIG: GaugeChartConfigurationDTO = { - configurationType: WidgetConfigurationType.GAUGE_CHART, - aggregateFieldMetadataId: TEST_FIELD_METADATA_ID_1, - aggregateOperation: AggregateOperations.SUM, - description: 'Completion percentage', - displayDataLabel: true, -}; - -export const TEST_GAUGE_CHART_CONFIG_MINIMAL: GaugeChartConfigurationDTO = { - configurationType: WidgetConfigurationType.GAUGE_CHART, - aggregateFieldMetadataId: TEST_FIELD_METADATA_ID_1, - aggregateOperation: AggregateOperations.COUNT_TRUE, - displayDataLabel: false, -}; - export const INVALID_IFRAME_CONFIG_BAD_URL = { url: 'not-a-valid-url', }; @@ -215,101 +72,154 @@ export const INVALID_NUMBER_CHART_CONFIG_BAD_UUID = { aggregateOperation: AggregateOperations.COUNT, }; -export const INVALID_NUMBER_CHART_CONFIG_INVALID_OPERATION = { - configurationType: WidgetConfigurationType.AGGREGATE_CHART, - aggregateFieldMetadataId: TEST_FIELD_METADATA_ID_1, - aggregateOperation: 'INVALID_OP' as any, -}; - export const INVALID_VERTICAL_BAR_CHART_CONFIG_MISSING_GROUP_BY = { configurationType: WidgetConfigurationType.BAR_CHART, - aggregateFieldMetadataId: TEST_FIELD_METADATA_ID_1, + aggregateFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_1, aggregateOperation: AggregateOperations.SUM, }; -export const INVALID_VERTICAL_BAR_CHART_CONFIG_BAD_ORDER_BY = { - configurationType: WidgetConfigurationType.BAR_CHART, - aggregateFieldMetadataId: TEST_FIELD_METADATA_ID_1, - aggregateOperation: AggregateOperations.SUM, - primaryAxisGroupByFieldMetadataId: TEST_FIELD_METADATA_ID_2, - primaryAxisOrderBy: 'INVALID_ORDER' as any, -}; - export const INVALID_HORIZONTAL_BAR_CHART_CONFIG_MISSING_GROUP_BY = { configurationType: WidgetConfigurationType.BAR_CHART, - aggregateFieldMetadataId: TEST_FIELD_METADATA_ID_1, + aggregateFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_1, aggregateOperation: AggregateOperations.SUM, }; -export const INVALID_HORIZONTAL_BAR_CHART_CONFIG_BAD_ORDER_BY = { - configurationType: WidgetConfigurationType.BAR_CHART, - aggregateFieldMetadataId: TEST_FIELD_METADATA_ID_1, - aggregateOperation: AggregateOperations.SUM, - primaryAxisGroupByFieldMetadataId: TEST_FIELD_METADATA_ID_2, - primaryAxisOrderBy: 'INVALID_ORDER' as any, -}; +// --- Unit-test-only graph configs (with hardcoded UUIDs, for validation tests) --- -export const CONFIG_TYPE_MISMATCH_IFRAME_WITH_GRAPH = { +export const TEST_NUMBER_CHART_CONFIG: AggregateChartConfigurationDTO = { configurationType: WidgetConfigurationType.AGGREGATE_CHART, - url: 'https://example.com', + aggregateFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_1, + aggregateOperation: AggregateOperations.COUNT, + label: 'Total Records', + description: 'Count of all records', + format: '0,0', + displayDataLabel: true, }; -export const CONFIG_TYPE_MISMATCH_GRAPH_WITH_IFRAME = { - url: 'https://example.com', +export const TEST_NUMBER_CHART_CONFIG_MINIMAL: AggregateChartConfigurationDTO = + { + configurationType: WidgetConfigurationType.AGGREGATE_CHART, + aggregateFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_1, + aggregateOperation: AggregateOperations.SUM, + displayDataLabel: false, + }; + +export const TEST_VERTICAL_BAR_CHART_CONFIG: BarChartConfigurationDTO = { + configurationType: WidgetConfigurationType.BAR_CHART, + layout: BarChartLayout.VERTICAL, + aggregateFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_1, + aggregateOperation: AggregateOperations.SUM, + primaryAxisGroupByFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_2, + primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, + displayDataLabel: true, + axisNameDisplay: AxisNameDisplay.NONE, + color: 'red', + description: 'Monthly revenue breakdown', + omitNullValues: true, + rangeMin: 0, + rangeMax: 100000, }; -export const ALL_VALID_GRAPH_CONFIGS = [ - TEST_NUMBER_CHART_CONFIG, - TEST_VERTICAL_BAR_CHART_CONFIG, - TEST_HORIZONTAL_BAR_CHART_CONFIG, - TEST_LINE_CHART_CONFIG, - TEST_PIE_CHART_CONFIG, - TEST_GAUGE_CHART_CONFIG, -]; +export const TEST_VERTICAL_BAR_CHART_CONFIG_MINIMAL: BarChartConfigurationDTO = + { + configurationType: WidgetConfigurationType.BAR_CHART, + layout: BarChartLayout.VERTICAL, + aggregateFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_1, + aggregateOperation: AggregateOperations.COUNT, + primaryAxisGroupByFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_2, + primaryAxisOrderBy: GraphOrderBy.VALUE_DESC, + displayDataLabel: false, + axisNameDisplay: AxisNameDisplay.NONE, + }; -export const ALL_MINIMAL_GRAPH_CONFIGS = [ - TEST_NUMBER_CHART_CONFIG_MINIMAL, - TEST_VERTICAL_BAR_CHART_CONFIG_MINIMAL, - TEST_HORIZONTAL_BAR_CHART_CONFIG_MINIMAL, - TEST_LINE_CHART_CONFIG_MINIMAL, - TEST_PIE_CHART_CONFIG_MINIMAL, - TEST_GAUGE_CHART_CONFIG_MINIMAL, -]; +export const TEST_HORIZONTAL_BAR_CHART_CONFIG: BarChartConfigurationDTO = { + configurationType: WidgetConfigurationType.BAR_CHART, + layout: BarChartLayout.HORIZONTAL, + aggregateFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_1, + aggregateOperation: AggregateOperations.SUM, + primaryAxisGroupByFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_2, + primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, + displayDataLabel: true, + axisNameDisplay: AxisNameDisplay.NONE, + color: 'blue', + description: 'Horizontal revenue breakdown', + omitNullValues: true, + rangeMin: 0, + rangeMax: 100000, +}; -export const ALL_INVALID_CONFIGS = [ - INVALID_IFRAME_CONFIG_BAD_URL, - INVALID_IFRAME_CONFIG_EMPTY_URL, - INVALID_NUMBER_CHART_CONFIG_MISSING_FIELDS, - INVALID_NUMBER_CHART_CONFIG_BAD_UUID, - INVALID_NUMBER_CHART_CONFIG_INVALID_OPERATION, - INVALID_VERTICAL_BAR_CHART_CONFIG_MISSING_GROUP_BY, - INVALID_VERTICAL_BAR_CHART_CONFIG_BAD_ORDER_BY, - INVALID_HORIZONTAL_BAR_CHART_CONFIG_MISSING_GROUP_BY, - INVALID_HORIZONTAL_BAR_CHART_CONFIG_BAD_ORDER_BY, -]; +export const TEST_HORIZONTAL_BAR_CHART_CONFIG_MINIMAL: BarChartConfigurationDTO = + { + configurationType: WidgetConfigurationType.BAR_CHART, + layout: BarChartLayout.HORIZONTAL, + aggregateFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_1, + aggregateOperation: AggregateOperations.COUNT, + primaryAxisGroupByFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_2, + primaryAxisOrderBy: GraphOrderBy.VALUE_DESC, + displayDataLabel: false, + axisNameDisplay: AxisNameDisplay.NONE, + }; -export function getValidConfigForWidgetType(widgetType: string): any { - switch (widgetType) { - case 'IFRAME': - return TEST_IFRAME_CONFIG; - case 'GRAPH': { - const configs = ALL_VALID_GRAPH_CONFIGS; +export const TEST_LINE_CHART_CONFIG: LineChartConfigurationDTO = { + configurationType: WidgetConfigurationType.LINE_CHART, + aggregateFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_1, + aggregateOperation: AggregateOperations.AVG, + primaryAxisGroupByFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_2, + primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, + secondaryAxisGroupByFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_3, + secondaryAxisOrderBy: GraphOrderBy.FIELD_DESC, + displayDataLabel: true, + axisNameDisplay: AxisNameDisplay.NONE, + color: 'cyan', + description: 'Trend over time', + omitNullValues: false, + rangeMin: -100, + rangeMax: 100, +}; - return configs[Math.floor(Math.random() * configs.length)]; - } - case 'STANDALONE_RICH_TEXT': - return TEST_STANDALONE_RICH_TEXT_CONFIG; - case 'VIEW': - case 'FIELDS': - case 'TIMELINE': - case 'TASKS': - case 'NOTES': - case 'FILES': - case 'EMAILS': - case 'CALENDAR': - case 'FIELD_RICH_TEXT': - return null; - default: - return null; - } -} +export const TEST_LINE_CHART_CONFIG_MINIMAL: LineChartConfigurationDTO = { + configurationType: WidgetConfigurationType.LINE_CHART, + aggregateFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_1, + aggregateOperation: AggregateOperations.MAX, + primaryAxisGroupByFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_2, + primaryAxisOrderBy: GraphOrderBy.VALUE_ASC, + displayDataLabel: false, + axisNameDisplay: AxisNameDisplay.NONE, +}; + +export const TEST_PIE_CHART_CONFIG: PieChartConfigurationDTO = { + configurationType: WidgetConfigurationType.PIE_CHART, + groupByFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_1, + aggregateFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_2, + aggregateOperation: AggregateOperations.SUM, + orderBy: GraphOrderBy.VALUE_DESC, + displayDataLabel: true, + displayLegend: true, + showCenterMetric: true, + color: 'yellow', + description: 'Distribution by category', +}; + +export const TEST_PIE_CHART_CONFIG_MINIMAL: PieChartConfigurationDTO = { + configurationType: WidgetConfigurationType.PIE_CHART, + groupByFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_1, + aggregateFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_2, + aggregateOperation: AggregateOperations.COUNT, + orderBy: GraphOrderBy.FIELD_ASC, + displayDataLabel: false, +}; + +export const TEST_GAUGE_CHART_CONFIG: GaugeChartConfigurationDTO = { + configurationType: WidgetConfigurationType.GAUGE_CHART, + aggregateFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_1, + aggregateOperation: AggregateOperations.SUM, + description: 'Completion percentage', + displayDataLabel: true, +}; + +export const TEST_GAUGE_CHART_CONFIG_MINIMAL: GaugeChartConfigurationDTO = { + configurationType: WidgetConfigurationType.GAUGE_CHART, + aggregateFieldMetadataId: UNIT_TEST_FIELD_METADATA_ID_1, + aggregateOperation: AggregateOperations.COUNT_TRUE, + displayDataLabel: false, +}; diff --git a/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/failing-create-view-field-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/failing-create-view-field-v2.integration-spec.ts.snap index 496b7cba47..1c4e7a3127 100644 --- a/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/failing-create-view-field-v2.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/failing-create-view-field-v2.integration-spec.ts.snap @@ -10,15 +10,14 @@ exports[`View Field Resolver - Failing Create Operation - v2 Should fail to crea "errors": [ { "code": "INVALID_VIEW_DATA", - "message": "View field with same fieldmetadataId and viewId already exists", + "message": "View field with same fieldMetadataUniversalIdentifier and viewUniversalIdentifier already exists", "userFriendlyMessage": "View field already exists", }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", diff --git a/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/object-identifier-update-side-effect-on-view-field.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/object-identifier-update-side-effect-on-view-field.integration-spec.ts.snap index e140f61fef..18dc91499f 100644 --- a/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/object-identifier-update-side-effect-on-view-field.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/object-identifier-update-side-effect-on-view-field.integration-spec.ts.snap @@ -15,10 +15,9 @@ exports[`View Field Resolver - Successful object metadata identifier update side }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -53,10 +52,9 @@ exports[`View Field Resolver - Successful object metadata identifier update side }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -91,7 +89,6 @@ exports[`View Field Resolver - Successful object metadata identifier update side }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "viewField", @@ -127,10 +124,9 @@ exports[`View Field Resolver - Successful object metadata identifier update side }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -165,10 +161,9 @@ exports[`View Field Resolver - Successful object metadata identifier update side }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", diff --git a/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-creation.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-creation.integration-spec.ts.snap index 97632a26c8..5cc15e272e 100644 --- a/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-creation.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-creation.integration-spec.ts.snap @@ -15,7 +15,6 @@ exports[`Agent creation should fail when computed name already exists 1`] = ` }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "existingTestAgent", "universalIdentifier": Any, }, @@ -52,7 +51,6 @@ exports[`Agent creation should fail when label is empty string 1`] = ` }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "", "universalIdentifier": Any, }, @@ -103,7 +101,6 @@ exports[`Agent creation should fail when modelId is empty string 1`] = ` }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "emptyModelidAgent", "universalIdentifier": Any, }, @@ -154,7 +151,6 @@ exports[`Agent creation should fail when prompt is empty string 1`] = ` }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "emptyPromptAgent", "universalIdentifier": Any, }, @@ -205,7 +201,6 @@ exports[`Agent creation should fail when responseFormat has invalid type 1`] = ` }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "invalidResponseFormatAgent", "universalIdentifier": Any, }, @@ -242,7 +237,6 @@ exports[`Agent creation should fail when responseFormat type is json but schema }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "jsonWithoutSchemaAgent", "universalIdentifier": Any, }, @@ -279,7 +273,6 @@ exports[`Agent creation should fail when responseFormat type is text but schema }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "textWithSchemaAgent", "universalIdentifier": Any, }, diff --git a/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-deletion.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-deletion.integration-spec.ts.snap index e60a0b80f6..0495455bc8 100644 --- a/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-deletion.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-deletion.integration-spec.ts.snap @@ -15,7 +15,6 @@ exports[`Agent deletion should fail should fail when attempting to delete a stan }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "helper", "universalIdentifier": Any, }, diff --git a/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-update.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-update.integration-spec.ts.snap index 3a7e2cd48a..aa81ef09dc 100644 --- a/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-update.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-update.integration-spec.ts.snap @@ -15,7 +15,6 @@ exports[`Agent update should fail should fail when attempting to update a standa }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "agent", @@ -73,7 +72,6 @@ exports[`Agent update should fail when settings null required properties 1`] = ` }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "agent", @@ -109,7 +107,6 @@ exports[`Agent update should fail when updating label to one that already exists }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "agent", @@ -145,7 +142,6 @@ exports[`Agent update should fail when updating responseFormat type to json with }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "agent", @@ -181,7 +177,6 @@ exports[`Agent update should fail when updating responseFormat type to text with }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "agent", @@ -217,7 +212,6 @@ exports[`Agent update should fail when updating responseFormat with invalid type }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "agent", @@ -253,7 +247,6 @@ exports[`Agent update should fail when updating with empty label 1`] = ` }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "agent", @@ -289,7 +282,6 @@ exports[`Agent update should fail when updating with empty modelId 1`] = ` }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "agent", @@ -325,7 +317,6 @@ exports[`Agent update should fail when updating with empty prompt 1`] = ` }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "agent", diff --git a/packages/twenty-server/test/integration/metadata/suites/command-menu-item/__snapshots__/failing-command-menu-item-creation.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/command-menu-item/__snapshots__/failing-command-menu-item-creation.integration-spec.ts.snap index 6cae0eb7b2..e7b040dd5f 100644 --- a/packages/twenty-server/test/integration/metadata/suites/command-menu-item/__snapshots__/failing-command-menu-item-creation.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/command-menu-item/__snapshots__/failing-command-menu-item-creation.integration-spec.ts.snap @@ -1,5 +1,17 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing +exports[`CommandMenuItem creation should fail when creating with both workflowVersionId and frontComponentId 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "subCode": "WORKFLOW_OR_FRONT_COMPONENT_REQUIRED", + "userFriendlyMessage": "Either workflow version or front component is required.", + }, + "message": "Exactly one of workflowVersionId or frontComponentId is required", + "name": "UserInputError", +} +`; + exports[`CommandMenuItem creation should fail when creating with empty label 1`] = ` { "extensions": { @@ -15,7 +27,6 @@ exports[`CommandMenuItem creation should fail when creating with empty label 1`] }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "commandMenuItem", @@ -36,32 +47,6 @@ exports[`CommandMenuItem creation should fail when creating with empty label 1`] } `; -exports[`CommandMenuItem creation should fail when creating with missing label 1`] = ` -{ - "extensions": { - "code": "BAD_USER_INPUT", - "http": { - "status": 400, - }, - "userFriendlyMessage": "An error occurred.", - }, - "message": "Field "label" of required type "String!" was not provided.", - "name": "GraphQLError", -} -`; - -exports[`CommandMenuItem creation should fail when creating with missing workflowVersionId 1`] = ` -{ - "extensions": { - "code": "BAD_USER_INPUT", - "subCode": "WORKFLOW_OR_FRONT_COMPONENT_REQUIRED", - "userFriendlyMessage": "Either workflow version or front component is required.", - }, - "message": "Exactly one of workflowVersionId or frontComponentId is required", - "name": "UserInputError", -} -`; - exports[`CommandMenuItem creation should fail when creating with empty workflowVersionId 1`] = ` { "extensions": { @@ -92,7 +77,21 @@ exports[`CommandMenuItem creation should fail when creating with invalid workflo } `; -exports[`CommandMenuItem creation should fail when creating with both workflowVersionId and frontComponentId 1`] = ` +exports[`CommandMenuItem creation should fail when creating with missing label 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "http": { + "status": 400, + }, + "userFriendlyMessage": "An error occurred.", + }, + "message": "Field "label" of required type "String!" was not provided.", + "name": "GraphQLError", +} +`; + +exports[`CommandMenuItem creation should fail when creating with missing workflowVersionId 1`] = ` { "extensions": { "code": "BAD_USER_INPUT", diff --git a/packages/twenty-server/test/integration/metadata/suites/command-menu-item/__snapshots__/failing-command-menu-item-update.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/command-menu-item/__snapshots__/failing-command-menu-item-update.integration-spec.ts.snap index e68eb0a3fb..076375d804 100644 --- a/packages/twenty-server/test/integration/metadata/suites/command-menu-item/__snapshots__/failing-command-menu-item-update.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/command-menu-item/__snapshots__/failing-command-menu-item-update.integration-spec.ts.snap @@ -1,5 +1,32 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing +exports[`CommandMenuItem update should fail when updating a non-existent command menu item 1`] = ` +{ + "extensions": { + "code": "NOT_FOUND", + "subCode": "COMMAND_MENU_ITEM_NOT_FOUND", + "userFriendlyMessage": "Command menu item not found.", + }, + "message": "Command menu item not found", + "name": "NotFoundError", +} +`; + +exports[`CommandMenuItem update should fail when updating with empty id 1`] = ` +{ + "extensions": { + "code": "GRAPHQL_VALIDATION_FAILED", + "http": { + "status": 400, + }, + "userFriendlyMessage": "An error occurred.", + "value": "", + }, + "message": "Invalid UUID", + "name": "ValidationError", +} +`; + exports[`CommandMenuItem update should fail when updating with empty label 1`] = ` { "extensions": { @@ -15,7 +42,6 @@ exports[`CommandMenuItem update should fail when updating with empty label 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "commandMenuItem", @@ -36,35 +62,6 @@ exports[`CommandMenuItem update should fail when updating with empty label 1`] = } `; -exports[`CommandMenuItem update should fail when updating with missing id 1`] = ` -{ - "extensions": { - "code": "BAD_USER_INPUT", - "http": { - "status": 400, - }, - "userFriendlyMessage": "An error occurred.", - }, - "message": "Field "id" of required type "UUID!" was not provided.", - "name": "GraphQLError", -} -`; - -exports[`CommandMenuItem update should fail when updating with empty id 1`] = ` -{ - "extensions": { - "code": "GRAPHQL_VALIDATION_FAILED", - "http": { - "status": 400, - }, - "userFriendlyMessage": "An error occurred.", - "value": "", - }, - "message": "Invalid UUID", - "name": "ValidationError", -} -`; - exports[`CommandMenuItem update should fail when updating with invalid id (not a UUID) 1`] = ` { "extensions": { @@ -80,14 +77,16 @@ exports[`CommandMenuItem update should fail when updating with invalid id (not a } `; -exports[`CommandMenuItem update should fail when updating a non-existent command menu item 1`] = ` +exports[`CommandMenuItem update should fail when updating with missing id 1`] = ` { "extensions": { - "code": "NOT_FOUND", - "subCode": "COMMAND_MENU_ITEM_NOT_FOUND", - "userFriendlyMessage": "Command menu item not found.", + "code": "BAD_USER_INPUT", + "http": { + "status": 400, + }, + "userFriendlyMessage": "An error occurred.", }, - "message": "Command menu item not found", - "name": "NotFoundError", + "message": "Field "id" of required type "UUID!" was not provided.", + "name": "GraphQLError", } `; diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/create-one-field-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/create-one-field-metadata.integration-spec.ts.snap index d030125638..f90da09133 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/create-one-field-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/create-one-field-metadata.integration-spec.ts.snap @@ -16,9 +16,8 @@ exports[`createOne FieldMetadataService name/label sync should return an error w }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/failing-create-one-field-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/failing-create-one-field-metadata.integration-spec.ts.snap index c2e44f56f1..deb65328bd 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/failing-create-one-field-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/failing-create-one-field-metadata.integration-spec.ts.snap @@ -17,9 +17,8 @@ exports[`Failing create field metadata tests suite should fail to create NUMERIC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "numericField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -58,9 +57,8 @@ exports[`Failing create field metadata tests suite should fail to create POSITIO }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "positionField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/update-one-field-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/update-one-field-metadata.integration-spec.ts.snap index 43357a8881..4d6b00b4da 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/update-one-field-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/update-one-field-metadata.integration-spec.ts.snap @@ -16,9 +16,8 @@ exports[`updateOne failing update should not update a field name if it is not sy }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "newName", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -62,9 +61,8 @@ exports[`updateOne failing update should throw if the field name is not availabl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "otherTestName", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/atomic/__snapshots__/create-one-files-field-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/atomic/__snapshots__/create-one-files-field-metadata.integration-spec.ts.snap index 77f53adbc7..e6372f87c9 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/atomic/__snapshots__/create-one-files-field-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/atomic/__snapshots__/create-one-files-field-metadata.integration-spec.ts.snap @@ -15,9 +15,8 @@ exports[`createOne FILES field metadata - failing should fail to create files fi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "filesFieldUnique", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -35,7 +34,6 @@ exports[`createOne FILES field metadata - failing should fail to create files fi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_UNIQUE_47bf8eae9471bbd64cbb794a3b6", "universalIdentifier": Any, }, @@ -73,9 +71,8 @@ exports[`createOne FILES field metadata - failing should fail to create files fi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "filesFieldInvalid", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -111,9 +108,8 @@ exports[`createOne FILES field metadata - failing should fail to create files fi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "filesFieldExceeds", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -149,9 +145,8 @@ exports[`createOne FILES field metadata - failing should fail to create files fi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "filesFieldNoSettings", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/atomic/__snapshots__/update-one-files-field-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/atomic/__snapshots__/update-one-files-field-metadata.integration-spec.ts.snap index 97a9ea9c68..96cf087b64 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/atomic/__snapshots__/update-one-files-field-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/atomic/__snapshots__/update-one-files-field-metadata.integration-spec.ts.snap @@ -15,9 +15,8 @@ exports[`updateOne FILES field metadata - failing should fail to update files fi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testFilesForFailure", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -53,9 +52,8 @@ exports[`updateOne FILES field metadata - failing should fail to update files fi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testFilesForFailure", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -91,9 +89,8 @@ exports[`updateOne FILES field metadata - failing should fail to update files fi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testFilesForFailure", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-create-one-field-metadata-enum-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-create-one-field-metadata-enum-v2.integration-spec.ts.snap index 7ecde4dbea..403b634292 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-create-one-field-metadata-enum-v2.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-create-one-field-metadata-enum-v2.integration-spec.ts.snap @@ -17,9 +17,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -58,9 +57,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -99,9 +97,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -155,9 +152,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -211,9 +207,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -267,9 +262,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -323,9 +317,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -364,9 +357,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -405,9 +397,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -452,9 +443,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -493,9 +483,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -534,9 +523,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -575,9 +563,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -634,9 +621,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -675,9 +661,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -716,9 +701,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -757,9 +741,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -798,9 +781,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -839,9 +821,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -880,9 +861,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -921,9 +901,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -967,9 +946,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1007,9 +985,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1048,9 +1025,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1088,9 +1064,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1135,9 +1110,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1176,9 +1150,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1217,9 +1190,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1258,9 +1230,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1305,9 +1276,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1346,9 +1316,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1387,9 +1356,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1434,9 +1402,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1474,9 +1441,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1514,9 +1480,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1555,9 +1520,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1596,9 +1560,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1643,9 +1606,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1684,9 +1646,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1725,9 +1686,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1781,9 +1741,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1837,9 +1796,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1893,9 +1851,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1949,9 +1906,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1990,9 +1946,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2037,9 +1992,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2078,9 +2032,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2119,9 +2072,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2160,9 +2112,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2201,9 +2152,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2242,9 +2192,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2283,9 +2232,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2324,9 +2272,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2365,9 +2312,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2406,9 +2352,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2452,9 +2397,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2492,9 +2436,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2533,9 +2476,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2573,9 +2515,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2620,9 +2561,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2661,9 +2601,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2702,9 +2641,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2743,9 +2681,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2790,9 +2727,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2831,9 +2767,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2872,9 +2807,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2919,9 +2853,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2959,9 +2892,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2999,9 +2931,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3040,9 +2971,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-update-one-enum-field-metadata-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-update-one-enum-field-metadata-v2.integration-spec.ts.snap index 41cf16df3e..9b26697697 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-update-one-enum-field-metadata-v2.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-update-one-enum-field-metadata-v2.integration-spec.ts.snap @@ -17,9 +17,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -58,9 +57,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -99,9 +97,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -155,9 +152,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -211,9 +207,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -267,9 +262,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -323,9 +317,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -364,9 +357,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -405,9 +397,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -452,9 +443,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -493,9 +483,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -534,9 +523,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -575,9 +563,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -634,9 +621,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -675,9 +661,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -716,9 +701,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -757,9 +741,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -798,9 +781,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -839,9 +821,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -880,9 +861,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -921,9 +901,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -967,9 +946,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1007,9 +985,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1047,9 +1024,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1094,9 +1070,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1135,9 +1110,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1176,9 +1150,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1217,9 +1190,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1264,9 +1236,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1305,9 +1276,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1346,9 +1316,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1393,9 +1362,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1433,9 +1401,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1473,9 +1440,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1514,9 +1480,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1555,9 +1520,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1602,9 +1566,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1643,9 +1606,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1684,9 +1646,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1740,9 +1701,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1796,9 +1756,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1852,9 +1811,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1908,9 +1866,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1949,9 +1906,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1996,9 +1952,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2037,9 +1992,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2078,9 +2032,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2119,9 +2072,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2160,9 +2112,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2201,9 +2152,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2242,9 +2192,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2283,9 +2232,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2324,9 +2272,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2365,9 +2312,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2411,9 +2357,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2451,9 +2396,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2491,9 +2435,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2538,9 +2481,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2579,9 +2521,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2620,9 +2561,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2661,9 +2601,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2708,9 +2647,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2749,9 +2687,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2790,9 +2727,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2837,9 +2773,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2877,9 +2812,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2917,9 +2851,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2958,9 +2891,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "testField", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-add-one-target-to-metadata-morph-relation-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-add-one-target-to-metadata-morph-relation-v2.integration-spec.ts.snap index 69406e8c27..d0a4c5c85e 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-add-one-target-to-metadata-morph-relation-v2.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-add-one-target-to-metadata-morph-relation-v2.integration-spec.ts.snap @@ -22,9 +22,8 @@ exports[`updateOne FieldMetadataService morph relation fields v2 - Add one targe }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "fieldNamePersonForMorphRelationSecond", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -40,9 +39,8 @@ exports[`updateOne FieldMetadataService morph relation fields v2 - Add one targe }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "toto", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -65,7 +63,6 @@ exports[`updateOne FieldMetadataService morph relation fields v2 - Add one targe }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_4ff93dd3375abd83d29ed3d01b4", "universalIdentifier": Any, }, @@ -103,9 +100,8 @@ exports[`updateOne FieldMetadataService morph relation fields v2 - Add one targe }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "fieldNameCompanyForMorphRelationSecond", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -121,9 +117,8 @@ exports[`updateOne FieldMetadataService morph relation fields v2 - Add one targe }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "toto", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -141,7 +136,6 @@ exports[`updateOne FieldMetadataService morph relation fields v2 - Add one targe }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_59563a0476bb3b8760e33ae6d5b", "universalIdentifier": Any, }, diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts.snap index 25688b8a12..b2c95cb7d0 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts.snap @@ -16,9 +16,8 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "toto", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -35,9 +34,8 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "tata", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -55,7 +53,6 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_4a59b92546a3dbf54abee51283a", "universalIdentifier": Any, }, @@ -72,7 +69,6 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_247f630f4f88242063a98b01371", "universalIdentifier": Any, }, @@ -111,9 +107,8 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "fieldNamePersonForMorphRelationSecondId", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -143,27 +138,66 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou { "errors": [ { - "code": "FIELD_METADATA_RELATION_MALFORMED", - "message": "Morph relation creation payloads must not target source object metadata", - "userFriendlyMessage": "An error occurred.", + "code": "INVALID_FIELD_INPUT", + "message": "Source object cannot be the target object", + "userFriendlyMessage": "Source object cannot be the target object", }, ], "flatEntityMinimalInformation": { - "id": Any, + "name": "fieldNameCompaniesForMorphRelationSecond", + "objectMetadataUniversalIdentifier": Any, + "universalIdentifier": Any, }, "metadataName": "fieldMetadata", + "status": "fail", + "type": "create", + }, + { + "errors": [ + { + "code": "FIELD_METADATA_NOT_FOUND", + "message": "Relation field target metadata not found in both existing and about to be created field metadatas", + "userFriendlyMessage": "Relation field target metadata not found", + }, + ], + "flatEntityMinimalInformation": { + "name": "tata", + "objectMetadataUniversalIdentifier": Any, + "universalIdentifier": Any, + }, + "metadataName": "fieldMetadata", + "status": "fail", + "type": "create", + }, + ], + "index": [ + { + "errors": [ + { + "code": "INDEX_FIELD_NOT_FOUND", + "message": "Could not find index field related field metadata", + "userFriendlyMessage": "Field referenced in index does not exist", + }, + ], + "flatEntityMinimalInformation": { + "name": "IDX_7cde21773589fbdb09355f3444c", + "universalIdentifier": Any, + }, + "metadataName": "index", + "status": "fail", "type": "create", }, ], }, - "message": "Validation failed for 1 fieldMetadata", + "message": "Validation failed for 2 fieldMetadatas, 1 index", "summary": { - "fieldMetadata": 1, - "totalErrors": 1, + "fieldMetadata": 2, + "index": 1, + "totalErrors": 3, }, "userFriendlyMessage": "Metadata validation failed", }, - "message": "Multiple validation errors occurred while creating field", + "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", } `; @@ -224,9 +258,8 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -244,7 +277,6 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_c1add8eb2b51d67721916a3e5a9", "universalIdentifier": Any, }, @@ -283,9 +315,8 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -303,7 +334,6 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_c84138bdf8bc3889ef56273281e", "universalIdentifier": Any, }, @@ -342,9 +372,8 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -362,7 +391,6 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_e07d8240883043fcb1ad1ba0324", "universalIdentifier": Any, }, @@ -407,9 +435,8 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -427,7 +454,6 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_c1add8eb2b51d67721916a3e5a9", "universalIdentifier": Any, }, diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-creation.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-creation.integration-spec.ts.snap index e0aa8fc790..622356eb02 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-creation.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-creation.integration-spec.ts.snap @@ -16,9 +16,8 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "fieldNameBisId", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -55,9 +54,8 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "fieldName", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -100,9 +98,8 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -139,9 +136,8 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -184,9 +180,8 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -382,9 +377,8 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE when }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "fieldNameBisId", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -400,9 +394,8 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE when }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "defaulttargetfieldlabel", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -420,7 +413,6 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE when }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_747db609dd2bb7abe30d5d1926c", "universalIdentifier": Any, }, @@ -539,9 +531,8 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE when }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "fieldName", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -557,9 +548,8 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE when }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "uniqueTargetLabel", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -577,7 +567,6 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE when }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_7ee6c7ff1e4648b0665f60cd5e4", "universalIdentifier": Any, }, @@ -657,9 +646,8 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "fieldNameBisId", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -677,7 +665,6 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_28fc32819c3dc0ec7c8594219fc", "universalIdentifier": Any, }, @@ -718,9 +705,8 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "fieldName", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -738,7 +724,6 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_e19260dc9ba8bb2ac7c39c6fcfd", "universalIdentifier": Any, }, @@ -785,9 +770,8 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -805,7 +789,6 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_78587d9d07f2ad40242e070725f", "universalIdentifier": Any, }, @@ -846,9 +829,8 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -866,7 +848,6 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_94535ac037cc2cd5eb316e87a54", "universalIdentifier": Any, }, @@ -913,9 +894,8 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -933,7 +913,6 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_78587d9d07f2ad40242e070725f", "universalIdentifier": Any, }, @@ -1141,9 +1120,8 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY when }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "fieldNameBisId", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1159,9 +1137,8 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY when }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "defaulttargetfieldlabel", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1179,7 +1156,6 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY when }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_8f338db6589d97164642f3fe641", "universalIdentifier": Any, }, @@ -1304,9 +1280,8 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY when }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "fieldName", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1322,9 +1297,8 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY when }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "uniqueTargetLabel", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1342,7 +1316,6 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY when }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_d41e56dfc90f36d133336f65736", "universalIdentifier": Any, }, @@ -1424,9 +1397,8 @@ exports[`Field metadata relation creation should fail should fail when creating }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "manager", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1463,9 +1435,8 @@ exports[`Field metadata relation creation should fail should fail when creating }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "manager", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1483,7 +1454,6 @@ exports[`Field metadata relation creation should fail should fail when creating }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_772faa136925e6c4141fd45ac0e", "universalIdentifier": Any, }, @@ -1522,9 +1492,8 @@ exports[`Field metadata relation creation should fail should fail when creating }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "fieldName", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1540,9 +1509,8 @@ exports[`Field metadata relation creation should fail should fail when creating }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "relatedObject", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1560,7 +1528,6 @@ exports[`Field metadata relation creation should fail should fail when creating }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_7ee6c7ff1e4648b0665f60cd5e4", "universalIdentifier": Any, }, @@ -1599,9 +1566,8 @@ exports[`Field metadata relation creation should fail should fail when creating }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "companyId", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1617,9 +1583,8 @@ exports[`Field metadata relation creation should fail should fail when creating }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "related", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1637,7 +1602,6 @@ exports[`Field metadata relation creation should fail should fail when creating }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_ed8240d8bc1e69a39dab1c17fe2", "universalIdentifier": Any, }, diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-update.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-update.integration-spec.ts.snap index be5a250532..b161096be2 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-update.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-update.integration-spec.ts.snap @@ -17,9 +17,8 @@ exports[`Field metadata relation update should fail relation when name is not in }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "New Name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -57,9 +56,8 @@ exports[`Field metadata relation update should fail relation when updating ONE_T }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "staff", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/unique-field/__snapshots__/create-one-unique-field-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/unique-field/__snapshots__/create-one-unique-field-metadata.integration-spec.ts.snap index 48a5d54d1d..1d7594fe03 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/unique-field/__snapshots__/create-one-unique-field-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/unique-field/__snapshots__/create-one-unique-field-metadata.integration-spec.ts.snap @@ -15,7 +15,6 @@ exports[`failing createOne unique field metadata should fail for composite type }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_UNIQUE_98d410e804d758f9bcceb154dde", "universalIdentifier": Any, }, @@ -52,7 +51,6 @@ exports[`failing createOne unique field metadata should fail when field has cust }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_UNIQUE_a1b02809c523cdc853d35fbc413", "universalIdentifier": Any, }, diff --git a/packages/twenty-server/test/integration/metadata/suites/front-component/__snapshots__/failing-front-component-creation.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/front-component/__snapshots__/failing-front-component-creation.integration-spec.ts.snap index aa90efb671..12ff6cd302 100644 --- a/packages/twenty-server/test/integration/metadata/suites/front-component/__snapshots__/failing-front-component-creation.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/front-component/__snapshots__/failing-front-component-creation.integration-spec.ts.snap @@ -15,7 +15,6 @@ exports[`Front component creation should fail when name is empty 1`] = ` }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "", "universalIdentifier": Any, }, @@ -52,7 +51,6 @@ exports[`Front component creation should fail when name is whitespace-only 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "", "universalIdentifier": Any, }, diff --git a/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-creation.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-creation.integration-spec.ts.snap index 856061fb1b..7e1e79121d 100644 --- a/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-creation.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-creation.integration-spec.ts.snap @@ -110,7 +110,6 @@ exports[`NavigationMenuItem creation should fail when creating with missing targ }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "navigationMenuItem", diff --git a/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-update-circular-dependency.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-update-circular-dependency.integration-spec.ts.snap index 7227274754..36e7942485 100644 --- a/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-update-circular-dependency.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-update-circular-dependency.integration-spec.ts.snap @@ -15,7 +15,6 @@ exports[`Navigation Menu Item update should fail with circular dependency when f }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "navigationMenuItem", @@ -51,7 +50,6 @@ exports[`Navigation Menu Item update should fail with circular dependency when u }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "navigationMenuItem", diff --git a/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-update.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-update.integration-spec.ts.snap index 7932d99328..1249756e8b 100644 --- a/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-update.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-update.integration-spec.ts.snap @@ -87,7 +87,6 @@ exports[`NavigationMenuItem update should fail when updating with negative posit }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "navigationMenuItem", diff --git a/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-create-one-object-metadata-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-create-one-object-metadata-v2.integration-spec.ts.snap index c768d5a6ad..21fbf97f46 100644 --- a/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-create-one-object-metadata-v2.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-create-one-object-metadata-v2.integration-spec.ts.snap @@ -15,9 +15,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "id", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -33,9 +32,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -51,9 +49,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -69,9 +66,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -87,9 +83,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -105,9 +100,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "deletedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -123,9 +117,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -141,9 +134,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "position", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -159,9 +151,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "searchVector", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -177,9 +168,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "timelineActivities", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -195,9 +185,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "favorites", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -213,9 +202,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "attachments", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -231,9 +219,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "noteTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -249,9 +236,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "taskTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -267,9 +253,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -285,9 +270,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "listinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -303,9 +287,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -321,9 +304,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -339,9 +321,8 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -364,7 +345,6 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_ffebb98ec981552dbecc71223c8", "universalIdentifier": Any, }, @@ -384,7 +364,6 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "listingas", "nameSingular": "listinga", "universalIdentifier": Any, @@ -404,7 +383,6 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "view", @@ -427,10 +405,9 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -450,10 +427,9 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -473,10 +449,9 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -496,10 +471,9 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -519,10 +493,9 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -542,10 +515,9 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -565,10 +537,9 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -588,10 +559,9 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -611,10 +581,9 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -634,10 +603,9 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -657,10 +625,9 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -680,10 +647,9 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -722,9 +688,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "id", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -740,9 +705,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -758,9 +722,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -776,9 +739,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -794,9 +756,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -812,9 +773,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "deletedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -830,9 +790,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -848,9 +807,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "position", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -866,9 +824,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "searchVector", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -884,9 +841,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "timelineActivities", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -902,9 +858,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "favorites", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -920,9 +875,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "attachments", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -938,9 +892,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "noteTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -956,9 +909,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "taskTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -974,9 +926,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -992,9 +943,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "listinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1010,9 +960,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1028,9 +977,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1046,9 +994,8 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1071,7 +1018,6 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_ffebb98ec981552dbecc71223c8", "universalIdentifier": Any, }, @@ -1091,7 +1037,6 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "listingas", "nameSingular": "listinga", "universalIdentifier": Any, @@ -1111,7 +1056,6 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "view", @@ -1134,10 +1078,9 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1157,10 +1100,9 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1180,10 +1122,9 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1203,10 +1144,9 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1226,10 +1166,9 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1249,10 +1188,9 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1272,10 +1210,9 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1295,10 +1232,9 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1318,10 +1254,9 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1341,10 +1276,9 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1364,10 +1298,9 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1387,10 +1320,9 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1440,9 +1372,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "id", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1458,9 +1389,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1476,9 +1406,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1494,9 +1423,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1512,9 +1440,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1530,9 +1457,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "deletedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1548,9 +1474,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1566,9 +1491,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "position", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1584,9 +1508,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "searchVector", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1602,9 +1525,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "timelineActivities", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1620,9 +1542,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "favorites", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1638,9 +1559,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "attachments", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1656,9 +1576,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "noteTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1674,9 +1593,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "taskTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1692,9 +1610,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1710,9 +1627,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "listinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1728,9 +1644,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1746,9 +1661,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1764,9 +1678,8 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -1789,7 +1702,6 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_ffebb98ec981552dbecc71223c8", "universalIdentifier": Any, }, @@ -1809,7 +1721,6 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "listingas", "nameSingular": "listinga", "universalIdentifier": Any, @@ -1829,7 +1740,6 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "view", @@ -1852,10 +1762,9 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1875,10 +1784,9 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1898,10 +1806,9 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1921,10 +1828,9 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1944,10 +1850,9 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1967,10 +1872,9 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -1990,10 +1894,9 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2013,10 +1916,9 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2036,10 +1938,9 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2059,10 +1960,9 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2082,10 +1982,9 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2105,10 +2004,9 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2147,9 +2045,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "id", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2165,9 +2062,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2183,9 +2079,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2201,9 +2096,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2219,9 +2113,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2237,9 +2130,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "deletedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2255,9 +2147,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2273,9 +2164,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "position", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2291,9 +2181,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "searchVector", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2309,9 +2198,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "timelineActivities", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2327,9 +2215,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "favorites", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2345,9 +2232,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "attachments", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2363,9 +2249,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "noteTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2381,9 +2266,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "taskTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2399,9 +2283,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2417,9 +2300,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "listinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2435,9 +2317,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2453,9 +2334,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2471,9 +2351,8 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2496,7 +2375,6 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_ffebb98ec981552dbecc71223c8", "universalIdentifier": Any, }, @@ -2516,7 +2394,6 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "listingas", "nameSingular": "listinga", "universalIdentifier": Any, @@ -2536,7 +2413,6 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "view", @@ -2559,10 +2435,9 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2582,10 +2457,9 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2605,10 +2479,9 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2628,10 +2501,9 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2651,10 +2523,9 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2674,10 +2545,9 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2697,10 +2567,9 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2720,10 +2589,9 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2743,10 +2611,9 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2766,10 +2633,9 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2789,10 +2655,9 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2812,10 +2677,9 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -2865,9 +2729,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "id", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2883,9 +2746,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2901,9 +2763,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2919,9 +2780,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2937,9 +2797,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2955,9 +2814,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "deletedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2973,9 +2831,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -2991,9 +2848,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "position", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3009,9 +2865,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "searchVector", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3027,9 +2882,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "timelineActivities", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3045,9 +2899,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "favorites", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3063,9 +2916,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "attachments", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3081,9 +2933,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "noteTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3099,9 +2950,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "taskTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3117,9 +2967,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3135,9 +2984,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "listinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3153,9 +3001,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3171,9 +3018,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3189,9 +3035,8 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3214,7 +3059,6 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_ffebb98ec981552dbecc71223c8", "universalIdentifier": Any, }, @@ -3234,7 +3078,6 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "listingas", "nameSingular": "listinga", "universalIdentifier": Any, @@ -3254,7 +3097,6 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "view", @@ -3277,10 +3119,9 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -3300,10 +3141,9 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -3323,10 +3163,9 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -3346,10 +3185,9 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -3369,10 +3207,9 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -3392,10 +3229,9 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -3415,10 +3251,9 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -3438,10 +3273,9 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -3461,10 +3295,9 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -3484,10 +3317,9 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -3507,10 +3339,9 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -3530,10 +3361,9 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -3572,9 +3402,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "id", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3590,9 +3419,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3608,9 +3436,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3626,9 +3453,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3644,9 +3470,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3662,9 +3487,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "deletedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3680,9 +3504,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3698,9 +3521,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "position", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3716,9 +3538,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "searchVector", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3734,9 +3555,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "timelineActivities", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3752,9 +3572,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "favorites", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3770,9 +3589,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "attachments", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3788,9 +3606,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "noteTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3806,9 +3623,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "taskTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3824,9 +3640,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3842,9 +3657,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "listinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3860,9 +3674,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3878,9 +3691,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3896,9 +3708,8 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -3921,7 +3732,6 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_ffebb98ec981552dbecc71223c8", "universalIdentifier": Any, }, @@ -3941,7 +3751,6 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "listingas", "nameSingular": "listinga", "universalIdentifier": Any, @@ -3961,7 +3770,6 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "view", @@ -3984,10 +3792,9 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4007,10 +3814,9 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4030,10 +3836,9 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4053,10 +3858,9 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4076,10 +3880,9 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4099,10 +3902,9 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4122,10 +3924,9 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4145,10 +3946,9 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4168,10 +3968,9 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4191,10 +3990,9 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4214,10 +4012,9 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4237,10 +4034,9 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4279,9 +4075,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "id", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4297,9 +4092,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4315,9 +4109,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4333,9 +4126,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4351,9 +4143,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4369,9 +4160,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "deletedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4387,9 +4177,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4405,9 +4194,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "position", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4423,9 +4211,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "searchVector", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4441,9 +4228,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "timelineActivities", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4459,9 +4245,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "favorites", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4477,9 +4262,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "attachments", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4495,9 +4279,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "noteTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4513,9 +4296,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "taskTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4537,9 +4319,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4561,9 +4342,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4585,9 +4365,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4609,9 +4388,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4633,9 +4411,8 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -4658,7 +4435,6 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_da4ca4dc0c441477f29e4a384b0", "universalIdentifier": Any, }, @@ -4678,7 +4454,6 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "listingas", "nameSingular": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "universalIdentifier": Any, @@ -4698,7 +4473,6 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "view", @@ -4721,10 +4495,9 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4744,10 +4517,9 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4767,10 +4539,9 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4790,10 +4561,9 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4813,10 +4583,9 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4836,10 +4605,9 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4859,10 +4627,9 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4882,10 +4649,9 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4905,10 +4671,9 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4928,10 +4693,9 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4951,10 +4715,9 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -4974,10 +4737,9 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -5016,9 +4778,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "id", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5034,9 +4795,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5052,9 +4812,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5070,9 +4829,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5088,9 +4846,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5106,9 +4863,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "deletedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5124,9 +4880,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5142,9 +4897,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "position", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5160,9 +4914,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "searchVector", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5178,9 +4931,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "timelineActivities", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5196,9 +4948,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "favorites", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5214,9 +4965,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "attachments", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5232,9 +4982,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "noteTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5250,9 +4999,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "taskTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5268,9 +5016,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5286,9 +5033,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "listinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5304,9 +5050,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5322,9 +5067,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5340,9 +5084,8 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5365,7 +5108,6 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_ffebb98ec981552dbecc71223c8", "universalIdentifier": Any, }, @@ -5385,7 +5127,6 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "μ", "nameSingular": "listinga", "universalIdentifier": Any, @@ -5405,7 +5146,6 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "view", @@ -5428,10 +5168,9 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -5451,10 +5190,9 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -5474,10 +5212,9 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -5497,10 +5234,9 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -5520,10 +5256,9 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -5543,10 +5278,9 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -5566,10 +5300,9 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -5589,10 +5322,9 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -5612,10 +5344,9 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -5635,10 +5366,9 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -5658,10 +5388,9 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -5681,10 +5410,9 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -5723,9 +5451,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "id", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5741,9 +5468,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5759,9 +5485,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5777,9 +5502,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5795,9 +5519,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5813,9 +5536,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "deletedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5831,9 +5553,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5849,9 +5570,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "position", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5867,9 +5587,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "searchVector", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5885,9 +5604,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "timelineActivities", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5903,9 +5621,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "favorites", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5921,9 +5638,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "attachments", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5939,9 +5655,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "noteTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5957,9 +5672,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "taskTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5975,9 +5689,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -5993,9 +5706,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "listinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6011,9 +5723,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6029,9 +5740,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6047,9 +5757,8 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6072,7 +5781,6 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_ffebb98ec981552dbecc71223c8", "universalIdentifier": Any, }, @@ -6092,7 +5800,6 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "users", "nameSingular": "listinga", "universalIdentifier": Any, @@ -6112,7 +5819,6 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "view", @@ -6135,10 +5841,9 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6158,10 +5863,9 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6181,10 +5885,9 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6204,10 +5907,9 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6227,10 +5929,9 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6250,10 +5951,9 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6273,10 +5973,9 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6296,10 +5995,9 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6319,10 +6017,9 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6342,10 +6039,9 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6365,10 +6061,9 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6388,10 +6083,9 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6441,9 +6135,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "id", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6459,9 +6152,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6477,9 +6169,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6495,9 +6186,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6513,9 +6203,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6531,9 +6220,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "deletedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6549,9 +6237,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6567,9 +6254,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "position", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6585,9 +6271,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "searchVector", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6603,9 +6288,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "timelineActivities", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6621,9 +6305,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "favorites", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6639,9 +6322,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "attachments", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6657,9 +6339,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "noteTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6675,9 +6356,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "taskTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6693,9 +6373,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6711,9 +6390,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "listinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6729,9 +6407,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6747,9 +6424,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6765,9 +6441,8 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetListinga", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -6790,7 +6465,6 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_ffebb98ec981552dbecc71223c8", "universalIdentifier": Any, }, @@ -6810,7 +6484,6 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "Not_Camel_Case", "nameSingular": "listinga", "universalIdentifier": Any, @@ -6830,7 +6503,6 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "view", @@ -6853,10 +6525,9 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6876,10 +6547,9 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6899,10 +6569,9 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6922,10 +6591,9 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6945,10 +6613,9 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6968,10 +6635,9 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -6991,10 +6657,9 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7014,10 +6679,9 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7037,10 +6701,9 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7060,10 +6723,9 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7083,10 +6745,9 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7106,10 +6767,9 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7148,9 +6808,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "id", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7166,9 +6825,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7184,9 +6842,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7202,9 +6859,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7220,9 +6876,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7238,9 +6893,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "deletedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7256,9 +6910,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7274,9 +6927,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "position", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7292,9 +6944,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "searchVector", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7310,9 +6961,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "timelineActivities", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7328,9 +6978,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "favorites", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7346,9 +6995,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "attachments", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7364,9 +7012,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "noteTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7382,9 +7029,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "taskTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7406,9 +7052,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetA a", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7430,9 +7075,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "a a", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7454,9 +7098,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetA a", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7478,9 +7121,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetA a", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7502,9 +7144,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetA a", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7527,7 +7168,6 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_2e70d840ef39341865172574229", "universalIdentifier": Any, }, @@ -7547,7 +7187,6 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "listingas", "nameSingular": "a a", "universalIdentifier": Any, @@ -7567,7 +7206,6 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "view", @@ -7590,10 +7228,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7613,10 +7250,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7636,10 +7272,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7659,10 +7294,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7682,10 +7316,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7705,10 +7338,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7728,10 +7360,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7751,10 +7382,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7774,10 +7404,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7797,10 +7426,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7820,10 +7448,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7843,10 +7470,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -7885,9 +7511,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "id", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7903,9 +7528,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7921,9 +7545,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7939,9 +7562,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7957,9 +7579,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7975,9 +7596,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "deletedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -7993,9 +7613,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8011,9 +7630,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "position", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8029,9 +7647,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "searchVector", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8047,9 +7664,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "timelineActivities", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8065,9 +7681,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "favorites", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8083,9 +7698,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "attachments", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8101,9 +7715,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "noteTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8119,9 +7732,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "taskTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8137,9 +7749,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "target", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8167,9 +7778,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8185,9 +7795,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "target", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8203,9 +7812,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "target", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8221,9 +7829,8 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "target", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8246,7 +7853,6 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_e0b8367f7f89bf39915991232b6", "universalIdentifier": Any, }, @@ -8272,7 +7878,6 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "listingas", "nameSingular": "", "universalIdentifier": Any, @@ -8292,7 +7897,6 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "view", @@ -8315,10 +7919,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -8338,10 +7941,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -8361,10 +7963,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -8384,10 +7985,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -8407,10 +8007,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -8430,10 +8029,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -8453,10 +8051,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -8476,10 +8073,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -8499,10 +8095,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -8522,10 +8117,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -8545,10 +8139,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -8568,10 +8161,9 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -8610,9 +8202,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "id", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8628,9 +8219,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8646,9 +8236,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8664,9 +8253,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8682,9 +8270,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8700,9 +8287,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "deletedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8718,9 +8304,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8736,9 +8321,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "position", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8754,9 +8338,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "searchVector", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8772,9 +8355,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "timelineActivities", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8790,9 +8372,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "favorites", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8808,9 +8389,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "attachments", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8826,9 +8406,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "noteTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8844,9 +8423,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "taskTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8868,9 +8446,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetΜ", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8892,9 +8469,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "μ", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8916,9 +8492,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetΜ", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8940,9 +8515,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetΜ", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8964,9 +8538,8 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetΜ", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -8989,7 +8562,6 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_e895f7d7a9fc30bad070509afab", "universalIdentifier": Any, }, @@ -9009,7 +8581,6 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "listingas", "nameSingular": "μ", "universalIdentifier": Any, @@ -9029,7 +8600,6 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "view", @@ -9052,10 +8622,9 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9075,10 +8644,9 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9098,10 +8666,9 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9121,10 +8688,9 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9144,10 +8710,9 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9167,10 +8732,9 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9190,10 +8754,9 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9213,10 +8776,9 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9236,10 +8798,9 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9259,10 +8820,9 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9282,10 +8842,9 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9305,10 +8864,9 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9347,9 +8905,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "id", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9365,9 +8922,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9383,9 +8939,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9401,9 +8956,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9419,9 +8973,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9437,9 +8990,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "deletedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9455,9 +9007,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9473,9 +9024,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "position", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9491,9 +9041,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "searchVector", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9509,9 +9058,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "timelineActivities", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9527,9 +9075,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "favorites", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9545,9 +9092,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "attachments", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9563,9 +9109,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "noteTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9581,9 +9126,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "taskTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9599,9 +9143,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetUser", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9623,9 +9166,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "user", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9641,9 +9183,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetUser", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9659,9 +9200,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetUser", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9677,9 +9217,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetUser", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -9702,7 +9241,6 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_00aaf7dba3ae2d70218bdebd383", "universalIdentifier": Any, }, @@ -9722,7 +9260,6 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "listingas", "nameSingular": "user", "universalIdentifier": Any, @@ -9742,7 +9279,6 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "view", @@ -9765,10 +9301,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9788,10 +9323,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9811,10 +9345,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9834,10 +9367,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9857,10 +9389,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9880,10 +9411,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9903,10 +9433,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9926,10 +9455,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9949,10 +9477,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9972,10 +9499,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -9995,10 +9521,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -10018,10 +9543,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -10071,9 +9595,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "id", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10089,9 +9612,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10107,9 +9629,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10125,9 +9646,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10143,9 +9663,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10161,9 +9680,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "deletedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10179,9 +9697,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10197,9 +9714,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "position", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10215,9 +9731,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "searchVector", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10233,9 +9748,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "timelineActivities", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10251,9 +9765,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "favorites", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10269,9 +9782,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "attachments", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10287,9 +9799,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "noteTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10305,9 +9816,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "taskTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10329,9 +9839,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetNot_Camel_Case", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10353,9 +9862,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "Not_Camel_Case", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10377,9 +9885,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetNot_Camel_Case", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10401,9 +9908,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetNot_Camel_Case", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10425,9 +9931,8 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetNot_Camel_Case", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10450,7 +9955,6 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_17a51d4440e492a8ec4d594c445", "universalIdentifier": Any, }, @@ -10470,7 +9974,6 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "listingas", "nameSingular": "Not_Camel_Case", "universalIdentifier": Any, @@ -10490,7 +9993,6 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "view", @@ -10513,10 +10015,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -10536,10 +10037,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -10559,10 +10059,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -10582,10 +10081,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -10605,10 +10103,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -10628,10 +10125,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -10651,10 +10147,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -10674,10 +10169,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -10697,10 +10191,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -10720,10 +10213,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -10743,10 +10235,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -10766,10 +10257,9 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -10808,9 +10298,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "id", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10826,9 +10315,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10844,9 +10332,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10862,9 +10349,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10880,9 +10366,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10898,9 +10383,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "deletedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10916,9 +10400,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10934,9 +10417,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "position", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10952,9 +10434,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "searchVector", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10970,9 +10451,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "timelineActivities", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -10988,9 +10468,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "favorites", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11006,9 +10485,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "attachments", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11024,9 +10502,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "noteTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11042,9 +10519,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "taskTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11060,9 +10536,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetFooBar", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11078,9 +10553,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "fooBar", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11096,9 +10570,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetFooBar", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11114,9 +10587,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetFooBar", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11132,9 +10604,8 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetFooBar", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11157,7 +10628,6 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_acbec9630e5330ad7c000993538", "universalIdentifier": Any, }, @@ -11177,7 +10647,6 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "fooBar", "nameSingular": "fooBar", "universalIdentifier": Any, @@ -11197,7 +10666,6 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "view", @@ -11220,10 +10688,9 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -11243,10 +10710,9 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -11266,10 +10732,9 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -11289,10 +10754,9 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -11312,10 +10776,9 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -11335,10 +10798,9 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -11358,10 +10820,9 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -11381,10 +10842,9 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -11404,10 +10864,9 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -11427,10 +10886,9 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -11450,10 +10908,9 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -11473,10 +10930,9 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -11515,9 +10971,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "id", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11533,9 +10988,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "name", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11551,9 +11005,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11569,9 +11022,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11587,9 +11039,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "updatedBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11605,9 +11056,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "deletedAt", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11623,9 +11073,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "createdBy", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11641,9 +11090,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "position", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11659,9 +11107,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "searchVector", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11677,9 +11124,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "timelineActivities", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11695,9 +11141,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "favorites", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11713,9 +11158,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "attachments", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11731,9 +11175,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "noteTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11749,9 +11192,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "taskTargets", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11767,9 +11209,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetFooBar", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11785,9 +11226,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "fooBar", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11803,9 +11243,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetFooBar", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11821,9 +11260,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetFooBar", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11839,9 +11277,8 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "targetFooBar", - "objectMetadataId": Any, + "objectMetadataUniversalIdentifier": Any, "universalIdentifier": Any, }, "metadataName": "fieldMetadata", @@ -11864,7 +11301,6 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "IDX_acbec9630e5330ad7c000993538", "universalIdentifier": Any, }, @@ -11884,7 +11320,6 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "fooBar", "nameSingular": "fooBar", "universalIdentifier": Any, @@ -11904,7 +11339,6 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "view", @@ -11927,10 +11361,9 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -11950,10 +11383,9 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -11973,10 +11405,9 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -11996,10 +11427,9 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -12019,10 +11449,9 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -12042,10 +11471,9 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -12065,10 +11493,9 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -12088,10 +11515,9 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -12111,10 +11537,9 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -12134,10 +11559,9 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -12157,10 +11581,9 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -12180,10 +11603,9 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", diff --git a/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-update-one-object-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-update-one-object-metadata.integration-spec.ts.snap index 9cacb62f7b..72c75fa2e6 100644 --- a/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-update-one-object-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-update-one-object-metadata.integration-spec.ts.snap @@ -11,12 +11,11 @@ exports[`Object metadata update should fail when labelIdentifier is not a TEXT o "errors": [ { "code": "INVALID_OBJECT_INPUT", - "message": "labelIdentifierFieldMetadataId validation failed: field type not compatible", + "message": "labelIdentifierFieldMetadataUniversalIdentifier validation failed: field type not compatible", "userFriendlyMessage": "Field cannot be used as label identifier", }, ], "flatEntityMinimalInformation": { - "id": Any, "namePlural": "whatevers", "nameSingular": "whatever", "universalIdentifier": Any, @@ -36,10 +35,9 @@ exports[`Object metadata update should fail when labelIdentifier is not a TEXT o }, ], "flatEntityMinimalInformation": { - "fieldMetadataId": Any, - "id": Any, + "fieldMetadataUniversalIdentifier": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewField", "status": "fail", @@ -93,43 +91,3 @@ exports[`Object metadata update should fail when labelIdentifier is not a uuid 1 }, ] `; - -exports[`Object metadata update should fail when labelIdentifier is null 1`] = ` -[ - { - "extensions": { - "code": "METADATA_VALIDATION_FAILED", - "errors": { - "objectMetadata": [ - { - "errors": [ - { - "code": "INVALID_OBJECT_INPUT", - "message": "labelIdentifierFieldMetadataId cannot be null", - "userFriendlyMessage": "Field label identifier is required", - }, - ], - "flatEntityMinimalInformation": { - "id": Any, - "namePlural": "whatevers", - "nameSingular": "whatever", - "universalIdentifier": Any, - }, - "metadataName": "objectMetadata", - "status": "fail", - "type": "update", - }, - ], - }, - "message": "Validation failed for 1 objectMetadata", - "summary": { - "objectMetadata": 1, - "totalErrors": 1, - }, - "userFriendlyMessage": "Metadata validation failed", - }, - "message": "Multiple validation errors occurred while updating object", - "name": "GraphQLError", - }, -] -`; diff --git a/packages/twenty-server/test/integration/metadata/suites/object-metadata/failing-update-one-object-metadata.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/object-metadata/failing-update-one-object-metadata.integration-spec.ts index 1fc1295323..8f2f7183e5 100644 --- a/packages/twenty-server/test/integration/metadata/suites/object-metadata/failing-update-one-object-metadata.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/object-metadata/failing-update-one-object-metadata.integration-spec.ts @@ -35,12 +35,6 @@ const labelIdentifierFailingTestsUseCase: CreateOneObjectMetadataItemTestingCont labelIdentifierFieldMetadataId: '42422020-f49c-4159-8751-76a24f47b360', }, }, - { - title: 'when labelIdentifier is null', - context: { - labelIdentifierFieldMetadataId: null as any, - }, - }, { title: 'when labelIdentifier is not a TEXT or NAME field', context: ({ numberFieldMetadataId }) => ({ diff --git a/packages/twenty-server/test/integration/metadata/suites/page-layout-widget/__snapshots__/successful-page-layout-widget-update.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/page-layout-widget/__snapshots__/successful-page-layout-widget-update.integration-spec.ts.snap index 92b9ab32f6..f0ef76cb58 100644 --- a/packages/twenty-server/test/integration/metadata/suites/page-layout-widget/__snapshots__/successful-page-layout-widget-update.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/page-layout-widget/__snapshots__/successful-page-layout-widget-update.integration-spec.ts.snap @@ -1,52 +1,6 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing -exports[`Page layout widget update should succeed should update page layout widget grid position 1`] = ` -{ - "configuration": { - "configurationType": "IFRAME", - "url": null, - }, - "createdAt": Any, - "deletedAt": null, - "gridPosition": { - "column": 3, - "columnSpan": 4, - "row": 2, - "rowSpan": 2, - }, - "id": Any, - "objectMetadataId": null, - "pageLayoutTabId": Any, - "title": "Original Widget Title", - "type": "IFRAME", - "updatedAt": Any, -} -`; - -exports[`Page layout widget update should succeed should update page layout widget title 1`] = ` -{ - "configuration": { - "configurationType": "IFRAME", - "url": null, - }, - "createdAt": Any, - "deletedAt": null, - "gridPosition": { - "column": 0, - "columnSpan": 1, - "row": 0, - "rowSpan": 1, - }, - "id": Any, - "objectMetadataId": null, - "pageLayoutTabId": Any, - "title": "Updated Widget Title", - "type": "IFRAME", - "updatedAt": Any, -} -`; - -exports[`Page layout widget update should succeed should update page layout widget to AGGREGATE_CHART configuration 1`] = ` +exports[`Page layout widget update should succeed from a GRAPH widget should update page layout widget to AGGREGATE_CHART configuration 1`] = ` { "configuration": { "aggregateFieldMetadataId": Any, @@ -73,13 +27,13 @@ exports[`Page layout widget update should succeed should update page layout widg "id": Any, "objectMetadataId": null, "pageLayoutTabId": Any, - "title": "Original Widget Title", + "title": "Original Graph Widget", "type": "GRAPH", "updatedAt": Any, } `; -exports[`Page layout widget update should succeed should update page layout widget to GAUGE_CHART configuration 1`] = ` +exports[`Page layout widget update should succeed from a GRAPH widget should update page layout widget to GAUGE_CHART configuration 1`] = ` { "configuration": { "aggregateFieldMetadataId": Any, @@ -103,13 +57,13 @@ exports[`Page layout widget update should succeed should update page layout widg "id": Any, "objectMetadataId": null, "pageLayoutTabId": Any, - "title": "Original Widget Title", + "title": "Original Graph Widget", "type": "GRAPH", "updatedAt": Any, } `; -exports[`Page layout widget update should succeed should update page layout widget to HORIZONTAL BAR_CHART configuration 1`] = ` +exports[`Page layout widget update should succeed from a GRAPH widget should update page layout widget to HORIZONTAL BAR_CHART configuration 1`] = ` { "configuration": { "aggregateFieldMetadataId": Any, @@ -151,36 +105,13 @@ exports[`Page layout widget update should succeed should update page layout widg "id": Any, "objectMetadataId": null, "pageLayoutTabId": Any, - "title": "Original Widget Title", + "title": "Original Graph Widget", "type": "GRAPH", "updatedAt": Any, } `; -exports[`Page layout widget update should succeed should update page layout widget to IFRAME configuration 1`] = ` -{ - "configuration": { - "configurationType": "IFRAME", - "url": "https://app.twenty.com/analytics", - }, - "createdAt": Any, - "deletedAt": null, - "gridPosition": { - "column": 0, - "columnSpan": 1, - "row": 0, - "rowSpan": 1, - }, - "id": Any, - "objectMetadataId": null, - "pageLayoutTabId": Any, - "title": "Original Widget Title", - "type": "IFRAME", - "updatedAt": Any, -} -`; - -exports[`Page layout widget update should succeed should update page layout widget to LINE_CHART configuration 1`] = ` +exports[`Page layout widget update should succeed from a GRAPH widget should update page layout widget to LINE_CHART configuration 1`] = ` { "configuration": { "aggregateFieldMetadataId": Any, @@ -221,13 +152,13 @@ exports[`Page layout widget update should succeed should update page layout widg "id": Any, "objectMetadataId": null, "pageLayoutTabId": Any, - "title": "Original Widget Title", + "title": "Original Graph Widget", "type": "GRAPH", "updatedAt": Any, } `; -exports[`Page layout widget update should succeed should update page layout widget to PIE_CHART configuration 1`] = ` +exports[`Page layout widget update should succeed from a GRAPH widget should update page layout widget to PIE_CHART configuration 1`] = ` { "configuration": { "aggregateFieldMetadataId": Any, @@ -258,39 +189,13 @@ exports[`Page layout widget update should succeed should update page layout widg "id": Any, "objectMetadataId": null, "pageLayoutTabId": Any, - "title": "Original Widget Title", + "title": "Original Graph Widget", "type": "GRAPH", "updatedAt": Any, } `; -exports[`Page layout widget update should succeed should update page layout widget to STANDALONE_RICH_TEXT configuration 1`] = ` -{ - "configuration": { - "body": { - "blocknote": "{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Hello world"}]}]}", - "markdown": "# Hello world", - }, - "configurationType": "STANDALONE_RICH_TEXT", - }, - "createdAt": Any, - "deletedAt": null, - "gridPosition": { - "column": 0, - "columnSpan": 1, - "row": 0, - "rowSpan": 1, - }, - "id": Any, - "objectMetadataId": null, - "pageLayoutTabId": Any, - "title": "Original Widget Title", - "type": "STANDALONE_RICH_TEXT", - "updatedAt": Any, -} -`; - -exports[`Page layout widget update should succeed should update page layout widget to VERTICAL BAR_CHART configuration 1`] = ` +exports[`Page layout widget update should succeed from a GRAPH widget should update page layout widget to VERTICAL BAR_CHART configuration 1`] = ` { "configuration": { "aggregateFieldMetadataId": Any, @@ -332,27 +237,89 @@ exports[`Page layout widget update should succeed should update page layout widg "id": Any, "objectMetadataId": null, "pageLayoutTabId": Any, - "title": "Original Widget Title", + "title": "Original Graph Widget", "type": "GRAPH", "updatedAt": Any, } `; -exports[`Page layout widget update should succeed should update page layout widget type 1`] = ` +exports[`Page layout widget update should succeed from a STANDALONE_RICH_TEXT widget should update page layout widget to STANDALONE_RICH_TEXT configuration 1`] = ` { "configuration": { - "aggregateFieldMetadataId": Any, - "aggregateOperation": "COUNT", - "configurationType": "AGGREGATE_CHART", - "description": "Count of all records", - "displayDataLabel": true, - "filter": null, - "firstDayOfTheWeek": 1, - "format": "0,0", - "label": "Total Records", - "prefix": null, - "suffix": null, - "timezone": "UTC", + "body": { + "blocknote": "{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Hello world"}]}]}", + "markdown": "# Hello world", + }, + "configurationType": "STANDALONE_RICH_TEXT", + }, + "createdAt": Any, + "deletedAt": null, + "gridPosition": { + "column": 0, + "columnSpan": 1, + "row": 0, + "rowSpan": 1, + }, + "id": Any, + "objectMetadataId": null, + "pageLayoutTabId": Any, + "title": "Original Rich Text Widget", + "type": "STANDALONE_RICH_TEXT", + "updatedAt": Any, +} +`; + +exports[`Page layout widget update should succeed from an IFRAME widget should update page layout widget grid position 1`] = ` +{ + "configuration": { + "configurationType": "IFRAME", + "url": "https://example.com/dashboard", + }, + "createdAt": Any, + "deletedAt": null, + "gridPosition": { + "column": 3, + "columnSpan": 4, + "row": 2, + "rowSpan": 2, + }, + "id": Any, + "objectMetadataId": null, + "pageLayoutTabId": Any, + "title": "Original Widget Title", + "type": "IFRAME", + "updatedAt": Any, +} +`; + +exports[`Page layout widget update should succeed from an IFRAME widget should update page layout widget title 1`] = ` +{ + "configuration": { + "configurationType": "IFRAME", + "url": "https://example.com/dashboard", + }, + "createdAt": Any, + "deletedAt": null, + "gridPosition": { + "column": 0, + "columnSpan": 1, + "row": 0, + "rowSpan": 1, + }, + "id": Any, + "objectMetadataId": null, + "pageLayoutTabId": Any, + "title": "Updated Widget Title", + "type": "IFRAME", + "updatedAt": Any, +} +`; + +exports[`Page layout widget update should succeed from an IFRAME widget should update page layout widget to IFRAME configuration 1`] = ` +{ + "configuration": { + "configurationType": "IFRAME", + "url": "https://app.twenty.com/analytics", }, "createdAt": Any, "deletedAt": null, @@ -366,7 +333,7 @@ exports[`Page layout widget update should succeed should update page layout widg "objectMetadataId": null, "pageLayoutTabId": Any, "title": "Original Widget Title", - "type": "GRAPH", + "type": "IFRAME", "updatedAt": Any, } `; diff --git a/packages/twenty-server/test/integration/metadata/suites/page-layout-widget/successful-page-layout-widget-creation.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/page-layout-widget/successful-page-layout-widget-creation.integration-spec.ts index e490123526..129039e736 100644 --- a/packages/twenty-server/test/integration/metadata/suites/page-layout-widget/successful-page-layout-widget-creation.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/page-layout-widget/successful-page-layout-widget-creation.integration-spec.ts @@ -1,22 +1,11 @@ import { - TEST_GAUGE_CHART_CONFIG, - TEST_GAUGE_CHART_CONFIG_MINIMAL, - TEST_HORIZONTAL_BAR_CHART_CONFIG, - TEST_HORIZONTAL_BAR_CHART_CONFIG_MINIMAL, TEST_IFRAME_CONFIG, - TEST_LINE_CHART_CONFIG, - TEST_LINE_CHART_CONFIG_MINIMAL, - TEST_NUMBER_CHART_CONFIG, - TEST_NUMBER_CHART_CONFIG_MINIMAL, - TEST_PIE_CHART_CONFIG, - TEST_PIE_CHART_CONFIG_MINIMAL, TEST_STANDALONE_RICH_TEXT_CONFIG, TEST_STANDALONE_RICH_TEXT_CONFIG_MINIMAL, - TEST_VERTICAL_BAR_CHART_CONFIG, - TEST_VERTICAL_BAR_CHART_CONFIG_MINIMAL, } from 'test/integration/constants/widget-configuration-test-data.constants'; import { createOnePageLayoutTab } from 'test/integration/metadata/suites/page-layout-tab/utils/create-one-page-layout-tab.util'; import { destroyOnePageLayoutTab } from 'test/integration/metadata/suites/page-layout-tab/utils/destroy-one-page-layout-tab.util'; +import { fetchTestFieldMetadataIds } from 'test/integration/metadata/suites/page-layout-widget/utils/fetch-test-field-metadata-ids.util'; import { createOnePageLayoutWidget } from 'test/integration/metadata/suites/page-layout-widget/utils/create-one-page-layout-widget.util'; import { destroyOnePageLayoutWidget } from 'test/integration/metadata/suites/page-layout-widget/utils/destroy-one-page-layout-widget.util'; import { createOnePageLayout } from 'test/integration/metadata/suites/page-layout/utils/create-one-page-layout.util'; @@ -27,11 +16,15 @@ import { eachTestingContextFilter, } from 'twenty-shared/testing'; +import { AggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/aggregate-operations.constant'; +import { AxisNameDisplay } from 'src/engine/metadata-modules/page-layout-widget/enums/axis-name-display.enum'; +import { BarChartLayout } from 'src/engine/metadata-modules/page-layout-widget/enums/bar-chart-layout.enum'; +import { GraphOrderBy } from 'src/engine/metadata-modules/page-layout-widget/enums/graph-order-by.enum'; import { WidgetConfigurationType } from 'src/engine/metadata-modules/page-layout-widget/enums/widget-configuration-type.type'; import { WidgetType } from 'src/engine/metadata-modules/page-layout-widget/enums/widget-type.enum'; import { type AllPageLayoutWidgetConfiguration } from 'src/engine/metadata-modules/page-layout-widget/types/all-page-layout-widget-configuration.type'; -type TestContext = { +type StaticTestContext = { input: { title: string; type: WidgetType; @@ -45,6 +38,11 @@ type TestContext = { }; }; +type GraphTestContext = { + widgetTitle: string; + buildConfiguration: () => AllPageLayoutWidgetConfiguration; +}; + const DEFAULT_GRID_POSITION = { row: 0, column: 0, @@ -52,8 +50,7 @@ const DEFAULT_GRID_POSITION = { columnSpan: 1, }; -const SUCCESSFUL_TEST_CASES: EachTestingContext[] = [ - // IFRAME widget tests +const STATIC_TEST_CASES: EachTestingContext[] = [ { title: 'create a page layout widget with IFRAME configuration', context: { @@ -78,7 +75,6 @@ const SUCCESSFUL_TEST_CASES: EachTestingContext[] = [ }, }, }, - // STANDALONE_RICH_TEXT widget tests { title: 'create a page layout widget with STANDALONE_RICH_TEXT configuration', @@ -103,184 +99,255 @@ const SUCCESSFUL_TEST_CASES: EachTestingContext[] = [ }, }, }, - // AGGREGATE_CHART (number chart) widget tests - { - title: - 'create a page layout widget with AGGREGATE_CHART full configuration', - context: { - input: { - title: 'Number Chart Widget', - type: WidgetType.GRAPH, - configuration: TEST_NUMBER_CHART_CONFIG, - gridPosition: DEFAULT_GRID_POSITION, - }, - }, - }, - { - title: - 'create a page layout widget with AGGREGATE_CHART minimal configuration', - context: { - input: { - title: 'Number Chart Widget Minimal', - type: WidgetType.GRAPH, - configuration: TEST_NUMBER_CHART_CONFIG_MINIMAL, - gridPosition: DEFAULT_GRID_POSITION, - }, - }, - }, - // BAR_CHART vertical widget tests - { - title: - 'create a page layout widget with VERTICAL BAR_CHART full configuration', - context: { - input: { - title: 'Vertical Bar Chart Widget', - type: WidgetType.GRAPH, - configuration: TEST_VERTICAL_BAR_CHART_CONFIG, - gridPosition: DEFAULT_GRID_POSITION, - }, - }, - }, - { - title: - 'create a page layout widget with VERTICAL BAR_CHART minimal configuration', - context: { - input: { - title: 'Vertical Bar Chart Widget Minimal', - type: WidgetType.GRAPH, - configuration: TEST_VERTICAL_BAR_CHART_CONFIG_MINIMAL, - gridPosition: DEFAULT_GRID_POSITION, - }, - }, - }, - // BAR_CHART horizontal widget tests - { - title: - 'create a page layout widget with HORIZONTAL BAR_CHART full configuration', - context: { - input: { - title: 'Horizontal Bar Chart Widget', - type: WidgetType.GRAPH, - configuration: TEST_HORIZONTAL_BAR_CHART_CONFIG, - gridPosition: DEFAULT_GRID_POSITION, - }, - }, - }, - { - title: - 'create a page layout widget with HORIZONTAL BAR_CHART minimal configuration', - context: { - input: { - title: 'Horizontal Bar Chart Widget Minimal', - type: WidgetType.GRAPH, - configuration: TEST_HORIZONTAL_BAR_CHART_CONFIG_MINIMAL, - gridPosition: DEFAULT_GRID_POSITION, - }, - }, - }, - // PIE_CHART widget tests - { - title: 'create a page layout widget with PIE_CHART full configuration', - context: { - input: { - title: 'Pie Chart Widget', - type: WidgetType.GRAPH, - configuration: TEST_PIE_CHART_CONFIG, - gridPosition: DEFAULT_GRID_POSITION, - }, - }, - }, - { - title: 'create a page layout widget with PIE_CHART minimal configuration', - context: { - input: { - title: 'Pie Chart Widget Minimal', - type: WidgetType.GRAPH, - configuration: TEST_PIE_CHART_CONFIG_MINIMAL, - gridPosition: DEFAULT_GRID_POSITION, - }, - }, - }, - // LINE_CHART widget tests - { - title: 'create a page layout widget with LINE_CHART full configuration', - context: { - input: { - title: 'Line Chart Widget', - type: WidgetType.GRAPH, - configuration: TEST_LINE_CHART_CONFIG, - gridPosition: DEFAULT_GRID_POSITION, - }, - }, - }, - { - title: 'create a page layout widget with LINE_CHART minimal configuration', - context: { - input: { - title: 'Line Chart Widget Minimal', - type: WidgetType.GRAPH, - configuration: TEST_LINE_CHART_CONFIG_MINIMAL, - gridPosition: DEFAULT_GRID_POSITION, - }, - }, - }, - // GAUGE_CHART widget tests - { - title: 'create a page layout widget with GAUGE_CHART full configuration', - context: { - input: { - title: 'Gauge Chart Widget', - type: WidgetType.GRAPH, - configuration: TEST_GAUGE_CHART_CONFIG, - gridPosition: DEFAULT_GRID_POSITION, - }, - }, - }, - { - title: 'create a page layout widget with GAUGE_CHART minimal configuration', - context: { - input: { - title: 'Gauge Chart Widget Minimal', - type: WidgetType.GRAPH, - configuration: TEST_GAUGE_CHART_CONFIG_MINIMAL, - gridPosition: DEFAULT_GRID_POSITION, - }, - }, - }, ]; describe('Page layout widget creation should succeed', () => { - let testPageLayoutId: string; - let testPageLayoutTabId: string; + let testSetup: { + pageLayoutId: string; + pageLayoutTabId: string; + fieldMetadataId1: string; + fieldMetadataId2: string; + fieldMetadataId3: string; + }; let createdPageLayoutWidgetId: string; + const graphTestCases: EachTestingContext[] = [ + { + title: + 'create a page layout widget with AGGREGATE_CHART full configuration', + context: { + widgetTitle: 'Number Chart Widget', + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.AGGREGATE_CHART, + aggregateFieldMetadataId: testSetup.fieldMetadataId1, + aggregateOperation: AggregateOperations.COUNT, + label: 'Total Records', + description: 'Count of all records', + format: '0,0', + displayDataLabel: true, + }), + }, + }, + { + title: + 'create a page layout widget with AGGREGATE_CHART minimal configuration', + context: { + widgetTitle: 'Number Chart Widget Minimal', + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.AGGREGATE_CHART, + aggregateFieldMetadataId: testSetup.fieldMetadataId1, + aggregateOperation: AggregateOperations.SUM, + displayDataLabel: false, + }), + }, + }, + { + title: + 'create a page layout widget with VERTICAL BAR_CHART full configuration', + context: { + widgetTitle: 'Vertical Bar Chart Widget', + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.BAR_CHART, + layout: BarChartLayout.VERTICAL, + aggregateFieldMetadataId: testSetup.fieldMetadataId1, + aggregateOperation: AggregateOperations.SUM, + primaryAxisGroupByFieldMetadataId: testSetup.fieldMetadataId2, + primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, + displayDataLabel: true, + axisNameDisplay: AxisNameDisplay.NONE, + color: 'red', + description: 'Monthly revenue breakdown', + omitNullValues: true, + rangeMin: 0, + rangeMax: 100000, + }), + }, + }, + { + title: + 'create a page layout widget with VERTICAL BAR_CHART minimal configuration', + context: { + widgetTitle: 'Vertical Bar Chart Widget Minimal', + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.BAR_CHART, + layout: BarChartLayout.VERTICAL, + aggregateFieldMetadataId: testSetup.fieldMetadataId1, + aggregateOperation: AggregateOperations.COUNT, + primaryAxisGroupByFieldMetadataId: testSetup.fieldMetadataId2, + primaryAxisOrderBy: GraphOrderBy.VALUE_DESC, + displayDataLabel: false, + axisNameDisplay: AxisNameDisplay.NONE, + }), + }, + }, + { + title: + 'create a page layout widget with HORIZONTAL BAR_CHART full configuration', + context: { + widgetTitle: 'Horizontal Bar Chart Widget', + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.BAR_CHART, + layout: BarChartLayout.HORIZONTAL, + aggregateFieldMetadataId: testSetup.fieldMetadataId1, + aggregateOperation: AggregateOperations.SUM, + primaryAxisGroupByFieldMetadataId: testSetup.fieldMetadataId2, + primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, + displayDataLabel: true, + axisNameDisplay: AxisNameDisplay.NONE, + color: 'blue', + description: 'Horizontal revenue breakdown', + omitNullValues: true, + rangeMin: 0, + rangeMax: 100000, + }), + }, + }, + { + title: + 'create a page layout widget with HORIZONTAL BAR_CHART minimal configuration', + context: { + widgetTitle: 'Horizontal Bar Chart Widget Minimal', + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.BAR_CHART, + layout: BarChartLayout.HORIZONTAL, + aggregateFieldMetadataId: testSetup.fieldMetadataId1, + aggregateOperation: AggregateOperations.COUNT, + primaryAxisGroupByFieldMetadataId: testSetup.fieldMetadataId2, + primaryAxisOrderBy: GraphOrderBy.VALUE_DESC, + displayDataLabel: false, + axisNameDisplay: AxisNameDisplay.NONE, + }), + }, + }, + { + title: 'create a page layout widget with PIE_CHART full configuration', + context: { + widgetTitle: 'Pie Chart Widget', + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.PIE_CHART, + groupByFieldMetadataId: testSetup.fieldMetadataId1, + aggregateFieldMetadataId: testSetup.fieldMetadataId2, + aggregateOperation: AggregateOperations.SUM, + orderBy: GraphOrderBy.VALUE_DESC, + displayDataLabel: true, + displayLegend: true, + showCenterMetric: true, + color: 'yellow', + description: 'Distribution by category', + }), + }, + }, + { + title: 'create a page layout widget with PIE_CHART minimal configuration', + context: { + widgetTitle: 'Pie Chart Widget Minimal', + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.PIE_CHART, + groupByFieldMetadataId: testSetup.fieldMetadataId1, + aggregateFieldMetadataId: testSetup.fieldMetadataId2, + aggregateOperation: AggregateOperations.COUNT, + orderBy: GraphOrderBy.FIELD_ASC, + displayDataLabel: false, + }), + }, + }, + { + title: 'create a page layout widget with LINE_CHART full configuration', + context: { + widgetTitle: 'Line Chart Widget', + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.LINE_CHART, + aggregateFieldMetadataId: testSetup.fieldMetadataId1, + aggregateOperation: AggregateOperations.AVG, + primaryAxisGroupByFieldMetadataId: testSetup.fieldMetadataId2, + primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, + secondaryAxisGroupByFieldMetadataId: testSetup.fieldMetadataId3, + secondaryAxisOrderBy: GraphOrderBy.FIELD_DESC, + displayDataLabel: true, + axisNameDisplay: AxisNameDisplay.NONE, + color: 'cyan', + description: 'Trend over time', + omitNullValues: false, + rangeMin: -100, + rangeMax: 100, + }), + }, + }, + { + title: + 'create a page layout widget with LINE_CHART minimal configuration', + context: { + widgetTitle: 'Line Chart Widget Minimal', + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.LINE_CHART, + aggregateFieldMetadataId: testSetup.fieldMetadataId1, + aggregateOperation: AggregateOperations.MAX, + primaryAxisGroupByFieldMetadataId: testSetup.fieldMetadataId2, + primaryAxisOrderBy: GraphOrderBy.VALUE_ASC, + displayDataLabel: false, + axisNameDisplay: AxisNameDisplay.NONE, + }), + }, + }, + { + title: 'create a page layout widget with GAUGE_CHART full configuration', + context: { + widgetTitle: 'Gauge Chart Widget', + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.GAUGE_CHART, + aggregateFieldMetadataId: testSetup.fieldMetadataId1, + aggregateOperation: AggregateOperations.SUM, + description: 'Completion percentage', + displayDataLabel: true, + }), + }, + }, + { + title: + 'create a page layout widget with GAUGE_CHART minimal configuration', + context: { + widgetTitle: 'Gauge Chart Widget Minimal', + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.GAUGE_CHART, + aggregateFieldMetadataId: testSetup.fieldMetadataId1, + aggregateOperation: AggregateOperations.COUNT_TRUE, + displayDataLabel: false, + }), + }, + }, + ]; + beforeAll(async () => { + const testFieldMetadataIds = await fetchTestFieldMetadataIds(); + const { data: layoutData } = await createOnePageLayout({ expectToFail: false, input: { name: 'Test Page Layout For Widgets' }, }); - testPageLayoutId = layoutData.createPageLayout.id; - const { data: tabData } = await createOnePageLayoutTab({ expectToFail: false, input: { title: 'Test Tab For Widgets', - pageLayoutId: testPageLayoutId, + pageLayoutId: layoutData.createPageLayout.id, }, }); - testPageLayoutTabId = tabData.createPageLayoutTab.id; + testSetup = { + pageLayoutId: layoutData.createPageLayout.id, + pageLayoutTabId: tabData.createPageLayoutTab.id, + ...testFieldMetadataIds, + }; }); afterAll(async () => { await destroyOnePageLayoutTab({ expectToFail: false, - input: { id: testPageLayoutTabId }, + input: { id: testSetup.pageLayoutTabId }, }); await destroyOnePageLayout({ expectToFail: false, - input: { id: testPageLayoutId }, + input: { id: testSetup.pageLayoutId }, }); }); @@ -293,14 +360,36 @@ describe('Page layout widget creation should succeed', () => { } }); - it.each(eachTestingContextFilter(SUCCESSFUL_TEST_CASES))( + it.each(eachTestingContextFilter(STATIC_TEST_CASES))( 'should $title', async ({ context: { input } }) => { const { data } = await createOnePageLayoutWidget({ expectToFail: false, input: { ...input, - pageLayoutTabId: testPageLayoutTabId, + pageLayoutTabId: testSetup.pageLayoutTabId, + }, + }); + + createdPageLayoutWidgetId = data?.createPageLayoutWidget?.id; + + expect(data.createPageLayoutWidget).toMatchSnapshot( + extractRecordIdsAndDatesAsExpectAny({ ...data.createPageLayoutWidget }), + ); + }, + ); + + it.each(eachTestingContextFilter(graphTestCases))( + 'should $title', + async ({ context: { widgetTitle, buildConfiguration } }) => { + const { data } = await createOnePageLayoutWidget({ + expectToFail: false, + input: { + title: widgetTitle, + type: WidgetType.GRAPH, + configuration: buildConfiguration(), + pageLayoutTabId: testSetup.pageLayoutTabId, + gridPosition: DEFAULT_GRID_POSITION, }, }); diff --git a/packages/twenty-server/test/integration/metadata/suites/page-layout-widget/successful-page-layout-widget-update.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/page-layout-widget/successful-page-layout-widget-update.integration-spec.ts index f85a2e02c6..b69c895ea1 100644 --- a/packages/twenty-server/test/integration/metadata/suites/page-layout-widget/successful-page-layout-widget-update.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/page-layout-widget/successful-page-layout-widget-update.integration-spec.ts @@ -1,15 +1,11 @@ import { - TEST_GAUGE_CHART_CONFIG, - TEST_HORIZONTAL_BAR_CHART_CONFIG, + TEST_IFRAME_CONFIG, TEST_IFRAME_CONFIG_ALTERNATIVE, - TEST_LINE_CHART_CONFIG, - TEST_NUMBER_CHART_CONFIG, - TEST_PIE_CHART_CONFIG, TEST_STANDALONE_RICH_TEXT_CONFIG, - TEST_VERTICAL_BAR_CHART_CONFIG, } from 'test/integration/constants/widget-configuration-test-data.constants'; import { createOnePageLayoutTab } from 'test/integration/metadata/suites/page-layout-tab/utils/create-one-page-layout-tab.util'; import { destroyOnePageLayoutTab } from 'test/integration/metadata/suites/page-layout-tab/utils/destroy-one-page-layout-tab.util'; +import { fetchTestFieldMetadataIds } from 'test/integration/metadata/suites/page-layout-widget/utils/fetch-test-field-metadata-ids.util'; import { createOnePageLayoutWidget } from 'test/integration/metadata/suites/page-layout-widget/utils/create-one-page-layout-widget.util'; import { destroyOnePageLayoutWidget } from 'test/integration/metadata/suites/page-layout-widget/utils/destroy-one-page-layout-widget.util'; import { updateOnePageLayoutWidget } from 'test/integration/metadata/suites/page-layout-widget/utils/update-one-page-layout-widget.util'; @@ -21,14 +17,17 @@ import { eachTestingContextFilter, } from 'twenty-shared/testing'; +import { AggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/aggregate-operations.constant'; +import { AxisNameDisplay } from 'src/engine/metadata-modules/page-layout-widget/enums/axis-name-display.enum'; +import { BarChartLayout } from 'src/engine/metadata-modules/page-layout-widget/enums/bar-chart-layout.enum'; +import { GraphOrderBy } from 'src/engine/metadata-modules/page-layout-widget/enums/graph-order-by.enum'; import { WidgetConfigurationType } from 'src/engine/metadata-modules/page-layout-widget/enums/widget-configuration-type.type'; import { WidgetType } from 'src/engine/metadata-modules/page-layout-widget/enums/widget-type.enum'; import { type AllPageLayoutWidgetConfiguration } from 'src/engine/metadata-modules/page-layout-widget/types/all-page-layout-widget-configuration.type'; -type TestContext = { +type StaticUpdateTestContext = { input: { title?: string; - type?: WidgetType; configuration?: AllPageLayoutWidgetConfiguration; gridPosition?: { row: number; @@ -39,189 +38,338 @@ type TestContext = { }; }; -const SUCCESSFUL_TEST_CASES: EachTestingContext[] = [ - { - title: 'update page layout widget title', - context: { - input: { - title: 'Updated Widget Title', - }, - }, - }, - { - title: 'update page layout widget type', - context: { - input: { - type: WidgetType.GRAPH, - configuration: TEST_NUMBER_CHART_CONFIG, - }, - }, - }, - { - title: 'update page layout widget grid position', - context: { - input: { - gridPosition: { - row: 2, - column: 3, - rowSpan: 2, - columnSpan: 4, +type GraphUpdateTestContext = { + buildConfiguration: () => AllPageLayoutWidgetConfiguration; +}; + +const DEFAULT_GRID_POSITION = { + row: 0, + column: 0, + rowSpan: 1, + columnSpan: 1, +}; + +const IFRAME_UPDATE_TEST_CASES: EachTestingContext[] = + [ + { + title: 'update page layout widget title', + context: { + input: { + title: 'Updated Widget Title', }, }, }, - }, - // Configuration update tests - { - title: 'update page layout widget to IFRAME configuration', - context: { - input: { - configuration: TEST_IFRAME_CONFIG_ALTERNATIVE, + { + title: 'update page layout widget grid position', + context: { + input: { + gridPosition: { + row: 2, + column: 3, + rowSpan: 2, + columnSpan: 4, + }, + }, }, }, - }, - { - title: 'update page layout widget to STANDALONE_RICH_TEXT configuration', - context: { - input: { - type: WidgetType.STANDALONE_RICH_TEXT, - configuration: TEST_STANDALONE_RICH_TEXT_CONFIG, + { + title: 'update page layout widget to IFRAME configuration', + context: { + input: { + configuration: TEST_IFRAME_CONFIG_ALTERNATIVE, + }, }, }, - }, - { - title: 'update page layout widget to AGGREGATE_CHART configuration', - context: { - input: { - type: WidgetType.GRAPH, - configuration: TEST_NUMBER_CHART_CONFIG, - }, - }, - }, - { - title: 'update page layout widget to VERTICAL BAR_CHART configuration', - context: { - input: { - type: WidgetType.GRAPH, - configuration: TEST_VERTICAL_BAR_CHART_CONFIG, - }, - }, - }, - { - title: 'update page layout widget to HORIZONTAL BAR_CHART configuration', - context: { - input: { - type: WidgetType.GRAPH, - configuration: TEST_HORIZONTAL_BAR_CHART_CONFIG, - }, - }, - }, - { - title: 'update page layout widget to PIE_CHART configuration', - context: { - input: { - type: WidgetType.GRAPH, - configuration: TEST_PIE_CHART_CONFIG, - }, - }, - }, - { - title: 'update page layout widget to LINE_CHART configuration', - context: { - input: { - type: WidgetType.GRAPH, - configuration: TEST_LINE_CHART_CONFIG, - }, - }, - }, - { - title: 'update page layout widget to GAUGE_CHART configuration', - context: { - input: { - type: WidgetType.GRAPH, - configuration: TEST_GAUGE_CHART_CONFIG, - }, - }, - }, -]; + ]; describe('Page layout widget update should succeed', () => { - let testPageLayoutId: string; - let testPageLayoutTabId: string; - let testPageLayoutWidgetId: string; + let testSetup: { + pageLayoutId: string; + pageLayoutTabId: string; + fieldMetadataId1: string; + fieldMetadataId2: string; + fieldMetadataId3: string; + }; beforeAll(async () => { + const testFieldMetadataIds = await fetchTestFieldMetadataIds(); + const { data: layoutData } = await createOnePageLayout({ expectToFail: false, input: { name: 'Test Page Layout For Widget Updates' }, }); - testPageLayoutId = layoutData.createPageLayout.id; - const { data: tabData } = await createOnePageLayoutTab({ expectToFail: false, input: { title: 'Test Tab For Widget Updates', - pageLayoutId: testPageLayoutId, + pageLayoutId: layoutData.createPageLayout.id, }, }); - testPageLayoutTabId = tabData.createPageLayoutTab.id; + testSetup = { + pageLayoutId: layoutData.createPageLayout.id, + pageLayoutTabId: tabData.createPageLayoutTab.id, + ...testFieldMetadataIds, + }; }); afterAll(async () => { await destroyOnePageLayoutTab({ expectToFail: false, - input: { id: testPageLayoutTabId }, + input: { id: testSetup.pageLayoutTabId }, }); await destroyOnePageLayout({ expectToFail: false, - input: { id: testPageLayoutId }, + input: { id: testSetup.pageLayoutId }, }); }); - beforeEach(async () => { - const { data } = await createOnePageLayoutWidget({ - expectToFail: false, - input: { - title: 'Original Widget Title', - pageLayoutTabId: testPageLayoutTabId, - type: WidgetType.IFRAME, - configuration: { - configurationType: WidgetConfigurationType.IFRAME, - }, - gridPosition: { - row: 0, - column: 0, - rowSpan: 1, - columnSpan: 1, + describe('from an IFRAME widget', () => { + let testPageLayoutWidgetId: string; + + beforeEach(async () => { + const { data } = await createOnePageLayoutWidget({ + expectToFail: false, + input: { + title: 'Original Widget Title', + pageLayoutTabId: testSetup.pageLayoutTabId, + type: WidgetType.IFRAME, + configuration: TEST_IFRAME_CONFIG, + gridPosition: DEFAULT_GRID_POSITION, }, + }); + + testPageLayoutWidgetId = data.createPageLayoutWidget.id; + }); + + afterEach(async () => { + await destroyOnePageLayoutWidget({ + expectToFail: false, + input: { id: testPageLayoutWidgetId }, + }); + }); + + it.each(eachTestingContextFilter(IFRAME_UPDATE_TEST_CASES))( + 'should $title', + async ({ context: { input } }) => { + const { data } = await updateOnePageLayoutWidget({ + expectToFail: false, + input: { + id: testPageLayoutWidgetId, + ...input, + }, + }); + + expect(data.updatePageLayoutWidget).toMatchSnapshot( + extractRecordIdsAndDatesAsExpectAny({ + ...data.updatePageLayoutWidget, + }), + ); }, - }); - - testPageLayoutWidgetId = data.createPageLayoutWidget.id; + ); }); - afterEach(async () => { - await destroyOnePageLayoutWidget({ - expectToFail: false, - input: { id: testPageLayoutWidgetId }, - }); - }); + describe('from a STANDALONE_RICH_TEXT widget', () => { + let testPageLayoutWidgetId: string; - it.each(eachTestingContextFilter(SUCCESSFUL_TEST_CASES))( - 'should $title', - async ({ context: { input } }) => { + beforeEach(async () => { + const { data } = await createOnePageLayoutWidget({ + expectToFail: false, + input: { + title: 'Original Rich Text Widget', + pageLayoutTabId: testSetup.pageLayoutTabId, + type: WidgetType.STANDALONE_RICH_TEXT, + configuration: { + configurationType: WidgetConfigurationType.STANDALONE_RICH_TEXT, + body: { markdown: 'Initial content' }, + }, + gridPosition: DEFAULT_GRID_POSITION, + }, + }); + + testPageLayoutWidgetId = data.createPageLayoutWidget.id; + }); + + afterEach(async () => { + await destroyOnePageLayoutWidget({ + expectToFail: false, + input: { id: testPageLayoutWidgetId }, + }); + }); + + it('should update page layout widget to STANDALONE_RICH_TEXT configuration', async () => { const { data } = await updateOnePageLayoutWidget({ expectToFail: false, input: { id: testPageLayoutWidgetId, - ...input, + configuration: TEST_STANDALONE_RICH_TEXT_CONFIG, }, }); expect(data.updatePageLayoutWidget).toMatchSnapshot( - extractRecordIdsAndDatesAsExpectAny({ ...data.updatePageLayoutWidget }), + extractRecordIdsAndDatesAsExpectAny({ + ...data.updatePageLayoutWidget, + }), ); - }, - ); + }); + }); + + describe('from a GRAPH widget', () => { + let testPageLayoutWidgetId: string; + + const graphTestCases: EachTestingContext[] = [ + { + title: 'update page layout widget to AGGREGATE_CHART configuration', + context: { + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.AGGREGATE_CHART, + aggregateFieldMetadataId: testSetup.fieldMetadataId1, + aggregateOperation: AggregateOperations.COUNT, + label: 'Total Records', + description: 'Count of all records', + format: '0,0', + displayDataLabel: true, + }), + }, + }, + { + title: 'update page layout widget to VERTICAL BAR_CHART configuration', + context: { + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.BAR_CHART, + layout: BarChartLayout.VERTICAL, + aggregateFieldMetadataId: testSetup.fieldMetadataId1, + aggregateOperation: AggregateOperations.SUM, + primaryAxisGroupByFieldMetadataId: testSetup.fieldMetadataId2, + primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, + displayDataLabel: true, + axisNameDisplay: AxisNameDisplay.NONE, + color: 'red', + description: 'Monthly revenue breakdown', + omitNullValues: true, + rangeMin: 0, + rangeMax: 100000, + }), + }, + }, + { + title: + 'update page layout widget to HORIZONTAL BAR_CHART configuration', + context: { + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.BAR_CHART, + layout: BarChartLayout.HORIZONTAL, + aggregateFieldMetadataId: testSetup.fieldMetadataId1, + aggregateOperation: AggregateOperations.SUM, + primaryAxisGroupByFieldMetadataId: testSetup.fieldMetadataId2, + primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, + displayDataLabel: true, + axisNameDisplay: AxisNameDisplay.NONE, + color: 'blue', + description: 'Horizontal revenue breakdown', + omitNullValues: true, + rangeMin: 0, + rangeMax: 100000, + }), + }, + }, + { + title: 'update page layout widget to PIE_CHART configuration', + context: { + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.PIE_CHART, + groupByFieldMetadataId: testSetup.fieldMetadataId1, + aggregateFieldMetadataId: testSetup.fieldMetadataId2, + aggregateOperation: AggregateOperations.SUM, + orderBy: GraphOrderBy.VALUE_DESC, + displayDataLabel: true, + displayLegend: true, + showCenterMetric: true, + color: 'yellow', + description: 'Distribution by category', + }), + }, + }, + { + title: 'update page layout widget to LINE_CHART configuration', + context: { + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.LINE_CHART, + aggregateFieldMetadataId: testSetup.fieldMetadataId1, + aggregateOperation: AggregateOperations.AVG, + primaryAxisGroupByFieldMetadataId: testSetup.fieldMetadataId2, + primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, + secondaryAxisGroupByFieldMetadataId: testSetup.fieldMetadataId3, + secondaryAxisOrderBy: GraphOrderBy.FIELD_DESC, + displayDataLabel: true, + axisNameDisplay: AxisNameDisplay.NONE, + color: 'cyan', + description: 'Trend over time', + omitNullValues: false, + rangeMin: -100, + rangeMax: 100, + }), + }, + }, + { + title: 'update page layout widget to GAUGE_CHART configuration', + context: { + buildConfiguration: () => ({ + configurationType: WidgetConfigurationType.GAUGE_CHART, + aggregateFieldMetadataId: testSetup.fieldMetadataId1, + aggregateOperation: AggregateOperations.SUM, + description: 'Completion percentage', + displayDataLabel: true, + }), + }, + }, + ]; + + beforeEach(async () => { + const { data } = await createOnePageLayoutWidget({ + expectToFail: false, + input: { + title: 'Original Graph Widget', + pageLayoutTabId: testSetup.pageLayoutTabId, + type: WidgetType.GRAPH, + configuration: { + configurationType: WidgetConfigurationType.AGGREGATE_CHART, + aggregateFieldMetadataId: testSetup.fieldMetadataId1, + aggregateOperation: AggregateOperations.COUNT, + displayDataLabel: false, + }, + gridPosition: DEFAULT_GRID_POSITION, + }, + }); + + testPageLayoutWidgetId = data.createPageLayoutWidget.id; + }); + + afterEach(async () => { + await destroyOnePageLayoutWidget({ + expectToFail: false, + input: { id: testPageLayoutWidgetId }, + }); + }); + + it.each(eachTestingContextFilter(graphTestCases))( + 'should $title', + async ({ context: { buildConfiguration } }) => { + const { data } = await updateOnePageLayoutWidget({ + expectToFail: false, + input: { + id: testPageLayoutWidgetId, + configuration: buildConfiguration(), + }, + }); + + expect(data.updatePageLayoutWidget).toMatchSnapshot( + extractRecordIdsAndDatesAsExpectAny({ + ...data.updatePageLayoutWidget, + }), + ); + }, + ); + }); }); diff --git a/packages/twenty-server/test/integration/metadata/suites/page-layout-widget/utils/fetch-test-field-metadata-ids.util.ts b/packages/twenty-server/test/integration/metadata/suites/page-layout-widget/utils/fetch-test-field-metadata-ids.util.ts new file mode 100644 index 0000000000..bcc229f03f --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/page-layout-widget/utils/fetch-test-field-metadata-ids.util.ts @@ -0,0 +1,57 @@ +import { findManyObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/find-many-object-metadata.util'; +import { jestExpectToBeDefined } from 'test/utils/jest-expect-to-be-defined.util.test'; + +export type TestFieldMetadataIds = { + fieldMetadataId1: string; + fieldMetadataId2: string; + fieldMetadataId3: string; +}; + +// Uses well-known company fields that make semantic sense for chart configs: +// - employees (number field, suitable for aggregation) +// - name (text field, suitable for grouping) +// - domainName (link field, suitable for secondary grouping) +export const fetchTestFieldMetadataIds = + async (): Promise => { + const { objects } = await findManyObjectMetadata({ + expectToFail: false, + input: { + filter: {}, + paging: { first: 100 }, + }, + gqlFields: ` + id + nameSingular + fieldsList { + id + name + } + `, + }); + + const companyObject = objects.find( + (object) => object.nameSingular === 'company', + ); + + jestExpectToBeDefined(companyObject); + + const fieldsList = companyObject.fieldsList; + + jestExpectToBeDefined(fieldsList); + + const findFieldByName = (fieldName: string) => { + const field = fieldsList!.find( + (fieldMetadata) => fieldMetadata.name === fieldName, + ); + + jestExpectToBeDefined(field); + + return field!; + }; + + return { + fieldMetadataId1: findFieldByName('employees').id, + fieldMetadataId2: findFieldByName('name').id, + fieldMetadataId3: findFieldByName('domainName').id, + }; + }; diff --git a/packages/twenty-server/test/integration/metadata/suites/page-layout/successful-page-layout-with-tabs-update.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/page-layout/successful-page-layout-with-tabs-update.integration-spec.ts index 6d36200f9c..26df668b92 100644 --- a/packages/twenty-server/test/integration/metadata/suites/page-layout/successful-page-layout-with-tabs-update.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/page-layout/successful-page-layout-with-tabs-update.integration-spec.ts @@ -1,5 +1,6 @@ import { createOnePageLayoutTab } from 'test/integration/metadata/suites/page-layout-tab/utils/create-one-page-layout-tab.util'; import { destroyOnePageLayoutTab } from 'test/integration/metadata/suites/page-layout-tab/utils/destroy-one-page-layout-tab.util'; +import { fetchTestFieldMetadataIds } from 'test/integration/metadata/suites/page-layout-widget/utils/fetch-test-field-metadata-ids.util'; import { createOnePageLayout } from 'test/integration/metadata/suites/page-layout/utils/create-one-page-layout.util'; import { destroyOnePageLayout } from 'test/integration/metadata/suites/page-layout/utils/destroy-one-page-layout.util'; import { updateOnePageLayoutWithTabsAndWidgets } from 'test/integration/metadata/suites/page-layout/utils/update-one-page-layout-with-tabs-and-widgets.util'; @@ -16,13 +17,6 @@ import { WidgetType } from 'src/engine/metadata-modules/page-layout-widget/enums import { type AllPageLayoutWidgetConfiguration } from 'src/engine/metadata-modules/page-layout-widget/types/all-page-layout-widget-configuration.type'; import { PageLayoutType } from 'src/engine/metadata-modules/page-layout/enums/page-layout-type.enum'; -const MOCK_PIE_CHART_CONFIGURATION = { - configurationType: WidgetConfigurationType.PIE_CHART, - aggregateFieldMetadataId: '20202020-77d3-42ff-adc6-cffdad2792c7', - aggregateOperation: AggregateOperations.COUNT, - groupByFieldMetadataId: '20202020-a9fd-4071-9082-db4870ed2430', -} as const satisfies AllPageLayoutWidgetConfiguration; - const MOCK_IFRAME_CONFIGURATION = { configurationType: WidgetConfigurationType.IFRAME, url: 'https://example.com', @@ -56,78 +50,114 @@ type TestContext = { }>; }; -const SUCCESSFUL_TEST_CASES: EachTestingContext[] = [ - { - title: 'update page layout with single tab and widget', - context: { - layoutName: 'Updated Page Layout', - buildTabs: ({ tabId1, pieChartWidgetId }) => [ - { - id: tabId1, - title: 'Updated Tab 1', - position: 0, - widgets: [ - { - id: pieChartWidgetId, - pageLayoutTabId: tabId1, - title: 'Pie Chart Widget', - type: WidgetType.GRAPH, - objectMetadataId: null, - gridPosition: { row: 0, column: 0, rowSpan: 1, columnSpan: 1 }, - configuration: MOCK_PIE_CHART_CONFIGURATION, - }, - ], - }, - ], - }, - }, - { - title: 'update page layout with multiple tabs and different widget types', - context: { - layoutName: 'Multi-Tab Layout', - buildTabs: ({ tabId1, tabId2, pieChartWidgetId, iframeWidgetId }) => [ - { - id: tabId1, - title: 'First Tab', - position: 0, - widgets: [ - { - id: pieChartWidgetId, - pageLayoutTabId: tabId1, - title: 'Pie Chart Widget', - type: WidgetType.GRAPH, - objectMetadataId: null, - gridPosition: { row: 0, column: 0, rowSpan: 1, columnSpan: 1 }, - configuration: MOCK_PIE_CHART_CONFIGURATION, - }, - ], - }, - { - id: tabId2, - title: 'Second Tab', - position: 1, - widgets: [ - { - id: iframeWidgetId, - pageLayoutTabId: tabId2, - title: 'Iframe Widget', - type: WidgetType.IFRAME, - objectMetadataId: null, - gridPosition: { row: 0, column: 0, rowSpan: 1, columnSpan: 1 }, - configuration: MOCK_IFRAME_CONFIGURATION, - }, - ], - }, - ], - }, - }, -]; - describe('Page layout with tabs update should succeed', () => { + let testFieldMetadataIds: { + fieldMetadataId1: string; + fieldMetadataId2: string; + fieldMetadataId3: string; + }; let testPageLayoutId: string; let testTabId1: string; let testTabId2: string; + const testCases: EachTestingContext[] = [ + { + title: 'update page layout with single tab and widget', + context: { + layoutName: 'Updated Page Layout', + buildTabs: ({ tabId1, pieChartWidgetId }) => [ + { + id: tabId1, + title: 'Updated Tab 1', + position: 0, + widgets: [ + { + id: pieChartWidgetId, + pageLayoutTabId: tabId1, + title: 'Pie Chart Widget', + type: WidgetType.GRAPH, + objectMetadataId: null, + gridPosition: { + row: 0, + column: 0, + rowSpan: 1, + columnSpan: 1, + }, + configuration: { + configurationType: WidgetConfigurationType.PIE_CHART, + aggregateFieldMetadataId: + testFieldMetadataIds.fieldMetadataId1, + aggregateOperation: AggregateOperations.COUNT, + groupByFieldMetadataId: testFieldMetadataIds.fieldMetadataId2, + }, + }, + ], + }, + ], + }, + }, + { + title: 'update page layout with multiple tabs and different widget types', + context: { + layoutName: 'Multi-Tab Layout', + buildTabs: ({ tabId1, tabId2, pieChartWidgetId, iframeWidgetId }) => [ + { + id: tabId1, + title: 'First Tab', + position: 0, + widgets: [ + { + id: pieChartWidgetId, + pageLayoutTabId: tabId1, + title: 'Pie Chart Widget', + type: WidgetType.GRAPH, + objectMetadataId: null, + gridPosition: { + row: 0, + column: 0, + rowSpan: 1, + columnSpan: 1, + }, + configuration: { + configurationType: WidgetConfigurationType.PIE_CHART, + aggregateFieldMetadataId: + testFieldMetadataIds.fieldMetadataId1, + aggregateOperation: AggregateOperations.COUNT, + groupByFieldMetadataId: testFieldMetadataIds.fieldMetadataId2, + }, + }, + ], + }, + { + id: tabId2, + title: 'Second Tab', + position: 1, + widgets: [ + { + id: iframeWidgetId, + pageLayoutTabId: tabId2, + title: 'Iframe Widget', + type: WidgetType.IFRAME, + objectMetadataId: null, + gridPosition: { + row: 0, + column: 0, + rowSpan: 1, + columnSpan: 1, + }, + configuration: MOCK_IFRAME_CONFIGURATION, + }, + ], + }, + ], + }, + }, + ]; + + beforeAll(async () => { + testFieldMetadataIds = await fetchTestFieldMetadataIds(); + }); + beforeEach(async () => { const { data: layoutData } = await createOnePageLayout({ expectToFail: false, @@ -175,7 +205,7 @@ describe('Page layout with tabs update should succeed', () => { }); }); - it.each(eachTestingContextFilter(SUCCESSFUL_TEST_CASES))( + it.each(eachTestingContextFilter(testCases))( 'should $title', async ({ context: { layoutName, buildTabs } }) => { const pieChartWidgetId = v4(); diff --git a/packages/twenty-server/test/integration/metadata/suites/role/__snapshots__/failing-role-creation.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/role/__snapshots__/failing-role-creation.integration-spec.ts.snap index d1d9119e22..9c8a0584cf 100644 --- a/packages/twenty-server/test/integration/metadata/suites/role/__snapshots__/failing-role-creation.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/role/__snapshots__/failing-role-creation.integration-spec.ts.snap @@ -15,7 +15,6 @@ exports[`Role creation should fail when canReadAllObjectRecords is false but can }, ], "flatEntityMinimalInformation": { - "id": Any, "label": "Inconsistent Destroy Role", "universalIdentifier": Any, }, @@ -52,7 +51,6 @@ exports[`Role creation should fail when canReadAllObjectRecords is false but can }, ], "flatEntityMinimalInformation": { - "id": Any, "label": "Inconsistent Soft Delete Role", "universalIdentifier": Any, }, @@ -89,7 +87,6 @@ exports[`Role creation should fail when canReadAllObjectRecords is false but can }, ], "flatEntityMinimalInformation": { - "id": Any, "label": "Inconsistent Update Role", "universalIdentifier": Any, }, @@ -126,7 +123,6 @@ exports[`Role creation should fail when canReadAllObjectRecords is false but mul }, ], "flatEntityMinimalInformation": { - "id": Any, "label": "Inconsistent Multiple Write Role", "universalIdentifier": Any, }, @@ -163,7 +159,6 @@ exports[`Role creation should fail when label already exists 1`] = ` }, ], "flatEntityMinimalInformation": { - "id": Any, "label": "Existing Test Role", "universalIdentifier": Any, }, diff --git a/packages/twenty-server/test/integration/metadata/suites/role/__snapshots__/failing-role-update.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/role/__snapshots__/failing-role-update.integration-spec.ts.snap index 69a02b9bcb..1e8d90e95f 100644 --- a/packages/twenty-server/test/integration/metadata/suites/role/__snapshots__/failing-role-update.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/role/__snapshots__/failing-role-update.integration-spec.ts.snap @@ -27,7 +27,6 @@ exports[`Role update should fail updating role with existing write permissions s }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "role", @@ -63,7 +62,6 @@ exports[`Role update should fail when updating a non-editable system role 1`] = }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "role", @@ -99,7 +97,6 @@ exports[`Role update should fail when updating canReadAllObjectRecords to false }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "role", @@ -135,7 +132,6 @@ exports[`Role update should fail when updating canReadAllObjectRecords to false }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "role", @@ -171,7 +167,6 @@ exports[`Role update should fail when updating canReadAllObjectRecords to false }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "role", @@ -207,7 +202,6 @@ exports[`Role update should fail when updating label to one that already exists }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "role", @@ -243,7 +237,6 @@ exports[`Role update should fail when updating to enable write permissions witho }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "role", diff --git a/packages/twenty-server/test/integration/metadata/suites/skill/__snapshots__/failing-skill-creation.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/skill/__snapshots__/failing-skill-creation.integration-spec.ts.snap index 5d5bda520f..54eb1e51f4 100644 --- a/packages/twenty-server/test/integration/metadata/suites/skill/__snapshots__/failing-skill-creation.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/skill/__snapshots__/failing-skill-creation.integration-spec.ts.snap @@ -15,7 +15,6 @@ exports[`Skill creation should fail when content is empty string 1`] = ` }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "emptyContentSkill", "universalIdentifier": Any, }, @@ -66,7 +65,6 @@ exports[`Skill creation should fail when label is empty string 1`] = ` }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "emptyLabelSkill", "universalIdentifier": Any, }, @@ -117,7 +115,6 @@ exports[`Skill creation should fail when name already exists 1`] = ` }, ], "flatEntityMinimalInformation": { - "id": Any, "name": "existingTestSkill", "universalIdentifier": Any, }, diff --git a/packages/twenty-server/test/integration/metadata/suites/skill/__snapshots__/failing-skill-update.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/skill/__snapshots__/failing-skill-update.integration-spec.ts.snap index b0343617d0..80ac72f2a4 100644 --- a/packages/twenty-server/test/integration/metadata/suites/skill/__snapshots__/failing-skill-update.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/skill/__snapshots__/failing-skill-update.integration-spec.ts.snap @@ -39,7 +39,6 @@ exports[`Skill update should fail when updating with empty content 1`] = ` }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "skill", @@ -75,7 +74,6 @@ exports[`Skill update should fail when updating with empty label 1`] = ` }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "skill", diff --git a/packages/twenty-server/test/integration/metadata/suites/view-filter-group/__snapshots__/failing-view-filter-group-creation-circular-dependency.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/view-filter-group/__snapshots__/failing-view-filter-group-creation-circular-dependency.integration-spec.ts.snap index f517daca37..543efd7271 100644 --- a/packages/twenty-server/test/integration/metadata/suites/view-filter-group/__snapshots__/failing-view-filter-group-creation-circular-dependency.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/view-filter-group/__snapshots__/failing-view-filter-group-creation-circular-dependency.integration-spec.ts.snap @@ -27,7 +27,6 @@ exports[`View Filter Group creation should fail with circular dependency when ma }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "viewFilterGroup", diff --git a/packages/twenty-server/test/integration/metadata/suites/view-filter-group/__snapshots__/failing-view-filter-group-update-circular-dependency.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/view-filter-group/__snapshots__/failing-view-filter-group-update-circular-dependency.integration-spec.ts.snap index d70acd0361..50601407c2 100644 --- a/packages/twenty-server/test/integration/metadata/suites/view-filter-group/__snapshots__/failing-view-filter-group-update-circular-dependency.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/view-filter-group/__snapshots__/failing-view-filter-group-update-circular-dependency.integration-spec.ts.snap @@ -15,7 +15,6 @@ exports[`View Filter Group update should fail with circular dependency when pare }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "viewFilterGroup", @@ -51,7 +50,6 @@ exports[`View Filter Group update should fail with circular dependency when upda }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, }, "metadataName": "viewFilterGroup", diff --git a/packages/twenty-server/test/integration/rest/suites/__snapshots__/view-group.integration-spec.ts.snap b/packages/twenty-server/test/integration/rest/suites/__snapshots__/view-group.integration-spec.ts.snap index f17c454a81..7828ebfded 100644 --- a/packages/twenty-server/test/integration/rest/suites/__snapshots__/view-group.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/rest/suites/__snapshots__/view-group.integration-spec.ts.snap @@ -14,9 +14,8 @@ exports[`View Group REST API POST /metadata/viewGroups should fail to create vie }, ], "flatEntityMinimalInformation": { - "id": Any, "universalIdentifier": Any, - "viewId": Any, + "viewUniversalIdentifier": Any, }, "metadataName": "viewGroup", "status": "fail",