diff --git a/packages/twenty-server/src/database/commands/upgrade-version/0-43/0-43-migrate-relations-to-field-metadata.command.ts b/packages/twenty-server/src/database/commands/upgrade-version/0-43/0-43-migrate-relations-to-field-metadata.command.ts index 752a942a9456..686f3d6e9815 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version/0-43/0-43-migrate-relations-to-field-metadata.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version/0-43/0-43-migrate-relations-to-field-metadata.command.ts @@ -19,7 +19,7 @@ import { RelationDirection, deduceRelationDirection, } from 'src/engine/utils/deduce-relation-direction.util'; -import { isFieldMetadataOfType } from 'src/engine/utils/is-field-metadata-of-type.util'; +import { isFieldMetadataEntityOfType } from 'src/engine/utils/is-field-metadata-of-type.util'; @MigrationCommand({ name: 'migrate-relations-to-field-metadata', @@ -89,13 +89,16 @@ export class MigrateRelationsToFieldMetadataCommand extends ActiveWorkspacesMigr const joinColumnFieldMetadataCollection = fieldMetadataCollection.filter( (fieldMetadata) => - isFieldMetadataOfType(fieldMetadata, FieldMetadataType.UUID), + isFieldMetadataEntityOfType(fieldMetadata, FieldMetadataType.UUID), // TODO: Fix this, it's working in other places but not here ) as FieldMetadataEntity[]; const fieldMetadataToUpdateCollection = fieldMetadataCollection .filter((fieldMetadata) => - isFieldMetadataOfType(fieldMetadata, FieldMetadataType.RELATION), + isFieldMetadataEntityOfType( + fieldMetadata, + FieldMetadataType.RELATION, + ), ) .map((fieldMetadata) => this.updateRelationFieldMetadata( diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/helpers/process-nested-relations-v2.helper.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/helpers/process-nested-relations-v2.helper.ts index f28bad5fcca7..671b1a569fc1 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/helpers/process-nested-relations-v2.helper.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/helpers/process-nested-relations-v2.helper.ts @@ -23,7 +23,7 @@ import { ObjectMetadataItemWithFieldMaps } from 'src/engine/metadata-modules/typ import { ObjectMetadataMaps } from 'src/engine/metadata-modules/types/object-metadata-maps'; import { getObjectMetadataMapItemByNameSingular } from 'src/engine/metadata-modules/utils/get-object-metadata-map-item-by-name-singular.util'; import { formatResult } from 'src/engine/twenty-orm/utils/format-result.util'; -import { isFieldMetadataOfType } from 'src/engine/utils/is-field-metadata-of-type.util'; +import { isFieldMetadataInterfaceOfType } from 'src/engine/utils/is-field-metadata-of-type.util'; @Injectable() export class ProcessNestedRelationsV2Helper { @@ -98,7 +98,10 @@ export class ProcessNestedRelationsV2Helper { parentObjectMetadataItem.fieldsByName[sourceFieldName]; if ( - !isFieldMetadataOfType(sourceFieldMetadata, FieldMetadataType.RELATION) + !isFieldMetadataInterfaceOfType( + sourceFieldMetadata, + FieldMetadataType.RELATION, + ) ) { // TODO: Maybe we should throw an error here ? return; diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/query-result-getters.factory.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/query-result-getters.factory.ts index 4c061b53ab0a..c0c7dd025724 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/query-result-getters.factory.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/query-result-getters.factory.ts @@ -21,7 +21,7 @@ import { CompositeInputTypeDefinitionFactory } from 'src/engine/api/graphql/work import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; import { FileService } from 'src/engine/core-modules/file/services/file.service'; import { ObjectMetadataMaps } from 'src/engine/metadata-modules/types/object-metadata-maps'; -import { isFieldMetadataOfType } from 'src/engine/utils/is-field-metadata-of-type.util'; +import { isFieldMetadataInterfaceOfType } from 'src/engine/utils/is-field-metadata-of-type.util'; // TODO: find a way to prevent conflict between handlers executing logic on object relations // And this factory that is also executing logic on object relations @@ -152,7 +152,10 @@ export class QueryResultGettersFactory { ) .filter(isDefined) .filter((fieldMetadata) => - isFieldMetadataOfType(fieldMetadata, FieldMetadataType.RELATION), + isFieldMetadataInterfaceOfType( + fieldMetadata, + FieldMetadataType.RELATION, + ), ); const relationFieldsProcessedMap = {} as Record< diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/factories/extend-object-type-definition-v2.factory.ts b/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/factories/extend-object-type-definition-v2.factory.ts index c966b38d0dcc..3f95c48a0ab2 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/factories/extend-object-type-definition-v2.factory.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/factories/extend-object-type-definition-v2.factory.ts @@ -15,7 +15,7 @@ import { RelationTypeV2Factory } from 'src/engine/api/graphql/workspace-schema-b import { TypeDefinitionsStorage } from 'src/engine/api/graphql/workspace-schema-builder/storages/type-definitions.storage'; import { getResolverArgs } from 'src/engine/api/graphql/workspace-schema-builder/utils/get-resolver-args.util'; import { objectContainsRelationField } from 'src/engine/api/graphql/workspace-schema-builder/utils/object-contains-relation-field'; -import { isFieldMetadataOfType } from 'src/engine/utils/is-field-metadata-of-type.util'; +import { isFieldMetadataInterfaceOfType } from 'src/engine/utils/is-field-metadata-of-type.util'; import { ArgsFactory } from './args.factory'; @@ -108,7 +108,12 @@ export class ExtendObjectTypeDefinitionV2Factory { for (const fieldMetadata of objectMetadata.fields) { // Ignore non-relation fields as they are already defined - if (!isFieldMetadataOfType(fieldMetadata, FieldMetadataType.RELATION)) { + if ( + !isFieldMetadataInterfaceOfType( + fieldMetadata, + FieldMetadataType.RELATION, + ) + ) { continue; } diff --git a/packages/twenty-server/src/engine/metadata-modules/relation-metadata/relation-metadata.service.ts b/packages/twenty-server/src/engine/metadata-modules/relation-metadata/relation-metadata.service.ts index 6d5510169525..9d06b459f40a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/relation-metadata/relation-metadata.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/relation-metadata/relation-metadata.service.ts @@ -9,6 +9,8 @@ import { v4 as uuidV4 } from 'uuid'; import { FieldMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata.interface'; +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 { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { FieldMetadataService } from 'src/engine/metadata-modules/field-metadata/field-metadata.service'; import { IndexMetadataService } from 'src/engine/metadata-modules/index-metadata/index-metadata.service'; @@ -55,6 +57,7 @@ export class RelationMetadataService extends TypeOrmQueryService, Type extends FieldMetadataType, >( fieldMetadata: Field, type: Type, -): fieldMetadata is Field & FieldMetadataInterface; -export function isFieldMetadataOfType< +): fieldMetadata is Field & FieldMetadataInterface { + return fieldMetadata.type === type; +} + +export function isFieldMetadataEntityOfType< Field extends FieldMetadataEntity, Type extends FieldMetadataType, >( fieldMetadata: Field, type: Type, -): fieldMetadata is Field & FieldMetadataEntity; -export function isFieldMetadataOfType< - Field extends - | FieldMetadataInterface - | FieldMetadataEntity, - Type extends FieldMetadataType, ->(fieldMetadata: Field, type: Type): boolean { +): fieldMetadata is Field & FieldMetadataEntity { return fieldMetadata.type === type; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-manager.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-manager.service.ts index a7d244624a3d..59c02af72df6 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-manager.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-manager.service.ts @@ -84,9 +84,13 @@ export class WorkspaceManagerService { schemaName, ); + const featureFlags = + await this.featureFlagService.getWorkspaceFeatureFlagsMap(workspaceId); + await this.workspaceSyncMetadataService.synchronize({ workspaceId, dataSourceId: dataSourceMetadata.id, + featureFlags, }); const dataSourceMetadataCreationEnd = performance.now(); @@ -140,9 +144,13 @@ export class WorkspaceManagerService { schemaName, ); + const featureFlags = + await this.featureFlagService.getWorkspaceFeatureFlagsMap(workspaceId); + await this.workspaceSyncMetadataService.synchronize({ workspaceId, dataSourceId: dataSourceMetadata.id, + featureFlags, }); await this.prefillWorkspaceWithDemoObjects(dataSourceMetadata, workspaceId); @@ -160,9 +168,13 @@ export class WorkspaceManagerService { schemaName, ); + const featureFlags = + await this.featureFlagService.getWorkspaceFeatureFlagsMap(workspaceId); + await this.workspaceSyncMetadataService.synchronize({ workspaceId: workspaceId, dataSourceId: dataSourceMetadata.id, + featureFlags, }); const permissionsEnabled = diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/commands/sync-workspace-metadata.command.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/commands/sync-workspace-metadata.command.ts index 219c196f41b5..43ccdf732789 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/commands/sync-workspace-metadata.command.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/commands/sync-workspace-metadata.command.ts @@ -7,6 +7,7 @@ import { ActiveWorkspacesMigrationCommandOptions, ActiveWorkspacesMigrationCommandRunner, } from 'src/database/commands/migration-command/active-workspaces-migration-command.runner'; +import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; @@ -32,6 +33,7 @@ export class SyncWorkspaceMetadataCommand extends ActiveWorkspacesMigrationComma private readonly workspaceHealthService: WorkspaceHealthService, private readonly dataSourceService: DataSourceService, private readonly syncWorkspaceLoggerService: SyncWorkspaceLoggerService, + private readonly featureFlagService: FeatureFlagService, protected readonly twentyORMGlobalManager: TwentyORMGlobalManager, ) { super(workspaceRepository, twentyORMGlobalManager); @@ -98,11 +100,17 @@ export class SyncWorkspaceMetadataCommand extends ActiveWorkspacesMigrationComma workspaceId, ); + const featureFlags = + await this.featureFlagService.getWorkspaceFeatureFlagsMap( + workspaceId, + ); + const { storage, workspaceMigrations } = await this.workspaceSyncMetadataService.synchronize( { workspaceId, dataSourceId: dataSourceMetadata.id, + featureFlags, }, { applyChanges: !options.dryRun }, ); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-field.factory.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-field.factory.ts index 29de3fe17f82..4249355dc9bf 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-field.factory.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-field.factory.ts @@ -2,7 +2,6 @@ import { Injectable } from '@nestjs/common'; import { FieldMetadataType } from 'twenty-shared'; -import { FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface'; import { WorkspaceDynamicRelationMetadataArgs } from 'src/engine/twenty-orm/interfaces/workspace-dynamic-relation-metadata-args.interface'; import { WorkspaceEntityMetadataArgs } from 'src/engine/twenty-orm/interfaces/workspace-entity-metadata-args.interface'; import { WorkspaceFieldMetadataArgs } from 'src/engine/twenty-orm/interfaces/workspace-field-metadata-args.interface'; @@ -13,6 +12,7 @@ import { } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/partial-field-metadata.interface'; import { WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; import { metadataArgsStorage } from 'src/engine/twenty-orm/storage/metadata-args.storage'; @@ -25,13 +25,11 @@ export class StandardFieldFactory { create( target: typeof BaseWorkspaceEntity, context: WorkspaceSyncContext, - workspaceFeatureFlagsMap: FeatureFlagMap, ): (PartialFieldMetadata | PartialComputedFieldMetadata)[]; create( targets: (typeof BaseWorkspaceEntity)[], context: WorkspaceSyncContext, - workspaceFeatureFlagsMap: FeatureFlagMap, // Map of standardId to field metadata ): Map; create( @@ -39,7 +37,6 @@ export class StandardFieldFactory { | typeof BaseWorkspaceEntity | (typeof BaseWorkspaceEntity)[], context: WorkspaceSyncContext, - workspaceFeatureFlagsMap: FeatureFlagMap, ): | (PartialFieldMetadata | PartialComputedFieldMetadata)[] | Map { @@ -55,7 +52,7 @@ export class StandardFieldFactory { if ( isGatedAndNotEnabled( workspaceEntityMetadataArgs.gate, - workspaceFeatureFlagsMap, + context.featureFlags, ) ) { return acc; @@ -63,7 +60,7 @@ export class StandardFieldFactory { acc.set( workspaceEntityMetadataArgs.standardId, - this.create(target, context, workspaceFeatureFlagsMap), + this.create(target, context), ); return acc; @@ -79,21 +76,18 @@ export class StandardFieldFactory { workspaceEntityMetadataArgs, metadataCollections.fields, context, - workspaceFeatureFlagsMap, this.createFieldMetadata, ), ...this.processMetadata( workspaceEntityMetadataArgs, metadataCollections.relations, context, - workspaceFeatureFlagsMap, this.createFieldRelationMetadata, ), ...this.processMetadata( workspaceEntityMetadataArgs, metadataCollections.dynamicRelations, context, - workspaceFeatureFlagsMap, this.createComputedFieldRelationMetadata, ), ]; @@ -114,22 +108,15 @@ export class StandardFieldFactory { workspaceEntityMetadataArgs: WorkspaceEntityMetadataArgs | undefined, metadataArgs: T[], context: WorkspaceSyncContext, - featureFlagsMap: FeatureFlagMap, createMetadata: ( workspaceEntityMetadataArgs: WorkspaceEntityMetadataArgs | undefined, args: T, context: WorkspaceSyncContext, - featureFlagsMap: FeatureFlagMap, ) => U[], ): U[] { return metadataArgs .flatMap((args) => - createMetadata( - workspaceEntityMetadataArgs, - args, - context, - featureFlagsMap, - ), + createMetadata(workspaceEntityMetadataArgs, args, context), ) .filter(Boolean) as U[]; } @@ -141,12 +128,11 @@ export class StandardFieldFactory { workspaceEntityMetadataArgs: WorkspaceEntityMetadataArgs | undefined, workspaceFieldMetadataArgs: WorkspaceFieldMetadataArgs, context: WorkspaceSyncContext, - workspaceFeatureFlagsMap: FeatureFlagMap, ): PartialFieldMetadata[] { if ( isGatedAndNotEnabled( workspaceFieldMetadataArgs.gate, - workspaceFeatureFlagsMap, + context.featureFlags, ) ) { return []; @@ -182,8 +168,10 @@ export class StandardFieldFactory { workspaceEntityMetadataArgs: WorkspaceEntityMetadataArgs | undefined, workspaceRelationMetadataArgs: WorkspaceRelationMetadataArgs, context: WorkspaceSyncContext, - workspaceFeatureFlagsMap: FeatureFlagMap, ): PartialFieldMetadata[] { + const isNewRelationEnabled = + context.featureFlags[FeatureFlagKey.IsNewRelationEnabled]; + const fieldMetadataCollection: PartialFieldMetadata[] = []; const foreignKeyStandardId = createDeterministicUuid( workspaceRelationMetadataArgs.standardId, @@ -200,13 +188,14 @@ export class StandardFieldFactory { if ( isGatedAndNotEnabled( workspaceRelationMetadataArgs.gate, - workspaceFeatureFlagsMap, + context.featureFlags, ) ) { return []; } - if (joinColumn) { + // We don't want to create the join column field metadata for new relation + if (!isNewRelationEnabled && joinColumn) { fieldMetadataCollection.push({ type: FieldMetadataType.UUID, standardId: foreignKeyStandardId, @@ -259,13 +248,12 @@ export class StandardFieldFactory { | WorkspaceDynamicRelationMetadataArgs | undefined, context: WorkspaceSyncContext, - workspaceFeatureFlagsMap: FeatureFlagMap, ): PartialComputedFieldMetadata[] { if ( !workspaceDynamicRelationMetadataArgs || isGatedAndNotEnabled( workspaceDynamicRelationMetadataArgs.gate, - workspaceFeatureFlagsMap, + context.featureFlags, ) ) { return []; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-index.factory.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-index.factory.ts index 5d6412fef7b7..e1b67d4cb3b5 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-index.factory.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-index.factory.ts @@ -1,6 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface'; import { PartialIndexMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/partial-index-metadata.interface'; import { WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface'; @@ -20,7 +19,6 @@ export class StandardIndexFactory { context: WorkspaceSyncContext, originalStandardObjectMetadataMap: Record, originalCustomObjectMetadataMap: Record, - workspaceFeatureFlagsMap: FeatureFlagMap, ): Partial[] { const standardIndexOnStandardObjects = standardObjectMetadataDefinitions.flatMap((standardObjectMetadata) => @@ -28,7 +26,6 @@ export class StandardIndexFactory { standardObjectMetadata, context, originalStandardObjectMetadataMap, - workspaceFeatureFlagsMap, ), ); @@ -36,7 +33,6 @@ export class StandardIndexFactory { this.createStandardIndexMetadataForCustomObject( context, originalCustomObjectMetadataMap, - workspaceFeatureFlagsMap, ); return [ @@ -49,7 +45,6 @@ export class StandardIndexFactory { target: typeof BaseWorkspaceEntity, context: WorkspaceSyncContext, originalStandardObjectMetadataMap: Record, - workspaceFeatureFlagsMap: FeatureFlagMap, ): Partial[] { const workspaceEntity = metadataArgsStorage.filterEntities(target); @@ -59,7 +54,7 @@ export class StandardIndexFactory { ); } - if (isGatedAndNotEnabled(workspaceEntity?.gate, workspaceFeatureFlagsMap)) { + if (isGatedAndNotEnabled(workspaceEntity?.gate, context.featureFlags)) { return []; } @@ -68,7 +63,7 @@ export class StandardIndexFactory { .filter((workspaceIndexMetadataArgs) => { return !isGatedAndNotEnabled( workspaceIndexMetadataArgs.gate, - workspaceFeatureFlagsMap, + context.featureFlags, ); }); @@ -102,7 +97,6 @@ export class StandardIndexFactory { private createStandardIndexMetadataForCustomObject( context: WorkspaceSyncContext, originalCustomObjectMetadataMap: Record, - workspaceFeatureFlagsMap: FeatureFlagMap, ): Partial[] { const target = CustomWorkspaceEntity; const workspaceEntity = metadataArgsStorage.filterExtendedEntities(target); @@ -118,7 +112,7 @@ export class StandardIndexFactory { .filter((workspaceIndexMetadataArgs) => { return !isGatedAndNotEnabled( workspaceIndexMetadataArgs.gate, - workspaceFeatureFlagsMap, + context.featureFlags, ); }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-object.factory.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-object.factory.ts index c45e3b9ae82b..e572777cdb84 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-object.factory.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-object.factory.ts @@ -1,6 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface'; import { PartialWorkspaceEntity } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/partial-object-metadata.interface'; import { WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface'; @@ -13,19 +12,15 @@ export class StandardObjectFactory { create( standardObjectMetadataDefinitions: (typeof BaseWorkspaceEntity)[], context: WorkspaceSyncContext, - workspaceFeatureFlagsMap: FeatureFlagMap, ): Omit[] { return standardObjectMetadataDefinitions - .map((metadata) => - this.createObjectMetadata(metadata, context, workspaceFeatureFlagsMap), - ) + .map((metadata) => this.createObjectMetadata(metadata, context)) .filter((metadata): metadata is PartialWorkspaceEntity => !!metadata); } private createObjectMetadata( target: typeof BaseWorkspaceEntity, context: WorkspaceSyncContext, - workspaceFeatureFlagsMap: FeatureFlagMap, ): Omit | undefined { const workspaceEntityMetadataArgs = metadataArgsStorage.filterEntities(target); @@ -39,7 +34,7 @@ export class StandardObjectFactory { if ( isGatedAndNotEnabled( workspaceEntityMetadataArgs.gate, - workspaceFeatureFlagsMap, + context.featureFlags, ) ) { return undefined; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-relation.factory.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-relation.factory.ts index f77d74f59ffb..ddb7a5b45fd6 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-relation.factory.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-relation.factory.ts @@ -1,18 +1,17 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface'; -import { FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface'; -import { isGatedAndNotEnabled } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/is-gate-and-not-enabled.util'; -import { assert } from 'src/utils/assert'; +import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { RelationMetadataEntity, RelationMetadataType, } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { convertClassNameToObjectMetadataName } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/convert-class-to-object-metadata-name.util'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; import { metadataArgsStorage } from 'src/engine/twenty-orm/storage/metadata-args.storage'; +import { convertClassNameToObjectMetadataName } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/convert-class-to-object-metadata-name.util'; +import { isGatedAndNotEnabled } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/is-gate-and-not-enabled.util'; +import { assert } from 'src/utils/assert'; interface CustomRelationFactory { object: ObjectMetadataEntity; @@ -25,14 +24,12 @@ export class StandardRelationFactory { customObjectFactories: CustomRelationFactory[], context: WorkspaceSyncContext, originalObjectMetadataMap: Record, - workspaceFeatureFlagsMap: FeatureFlagMap, ): Partial[]; create( standardObjectMetadataDefinitions: (typeof BaseWorkspaceEntity)[], context: WorkspaceSyncContext, originalObjectMetadataMap: Record, - workspaceFeatureFlagsMap: FeatureFlagMap, ): Partial[]; create( @@ -44,7 +41,6 @@ export class StandardRelationFactory { }[], context: WorkspaceSyncContext, originalObjectMetadataMap: Record, - workspaceFeatureFlagsMap: FeatureFlagMap, ): Partial[] { return standardObjectMetadataDefinitionsOrCustomObjectFactories.flatMap( ( @@ -56,7 +52,6 @@ export class StandardRelationFactory { standardObjectMetadata, context, originalObjectMetadataMap, - workspaceFeatureFlagsMap, ), ); } @@ -67,7 +62,6 @@ export class StandardRelationFactory { | CustomRelationFactory, context: WorkspaceSyncContext, originalObjectMetadataMap: Record, - workspaceFeatureFlagsMap: FeatureFlagMap, ): Partial[] { const target = 'metadata' in workspaceEntityOrCustomRelationFactory @@ -88,7 +82,7 @@ export class StandardRelationFactory { if ( !workspaceRelationMetadataArgsCollection || - isGatedAndNotEnabled(workspaceEntity?.gate, workspaceFeatureFlagsMap) + isGatedAndNotEnabled(workspaceEntity?.gate, context.featureFlags) ) { return []; } @@ -105,7 +99,7 @@ export class StandardRelationFactory { return !isGatedAndNotEnabled( workspaceRelationMetadataArgs.gate, - workspaceFeatureFlagsMap, + context.featureFlags, ); }) .map((workspaceRelationMetadataArgs) => { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface.ts index fc0c7b5c5586..386a8c88f849 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface.ts @@ -1,4 +1,7 @@ +import { FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface'; + export interface WorkspaceSyncContext { workspaceId: string; dataSourceId: string; + featureFlags: FeatureFlagMap; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-metadata-updater.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-metadata-updater.service.ts index 31f0f5e26186..7956358ecca8 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-metadata-updater.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-metadata-updater.service.ts @@ -15,6 +15,8 @@ import { v4 as uuidV4 } from 'uuid'; import { PartialFieldMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/partial-field-metadata.interface'; import { PartialIndexMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/partial-index-metadata.interface'; +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 { compositeTypeDefinitions } from 'src/engine/metadata-modules/field-metadata/composite-types'; import { FieldMetadataComplexOption } from 'src/engine/metadata-modules/field-metadata/dtos/options.input'; import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; @@ -24,12 +26,15 @@ import { IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/ import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { RelationMetadataEntity } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity'; import { CompositeFieldMetadataType } from 'src/engine/metadata-modules/workspace-migration/factories/composite-column-action.factory'; +import { isFieldMetadataEntityOfType } from 'src/engine/utils/is-field-metadata-of-type.util'; import { FieldMetadataUpdate } from 'src/engine/workspace-manager/workspace-migration-builder/factories/workspace-migration-field.factory'; import { ObjectMetadataUpdate } from 'src/engine/workspace-manager/workspace-migration-builder/factories/workspace-migration-object.factory'; import { WorkspaceSyncStorage } from 'src/engine/workspace-manager/workspace-sync-metadata/storage/workspace-sync.storage'; @Injectable() export class WorkspaceMetadataUpdaterService { + constructor(private readonly featureFlagService: FeatureFlagService) {} + async updateObjectMetadata( manager: EntityManager, storage: WorkspaceSyncStorage, @@ -275,6 +280,15 @@ export class WorkspaceMetadataUpdaterService { createdIndexMetadataCollection: IndexMetadataEntity[]; }> { const indexMetadataRepository = manager.getRepository(IndexMetadataEntity); + const workspaceId = originalObjectMetadataCollection?.[0]?.workspaceId; + let isNewRelationEnabled = false; + + if (workspaceId) { + isNewRelationEnabled = await this.featureFlagService.isFeatureEnabled( + FeatureFlagKey.IsNewRelationEnabled, + workspaceId, + ); + } const convertIndexMetadataForSaving = ( indexMetadata: PartialIndexMetadata, @@ -287,6 +301,15 @@ export class WorkspaceMetadataUpdaterService { const fieldMetadata = originalObjectMetadataCollection .find((object) => object.id === indexMetadata.objectMetadataId) ?.fields.find((field) => { + if ( + isNewRelationEnabled && + isFieldMetadataEntityOfType(field, FieldMetadataType.RELATION) + ) { + if (field.settings?.joinColumnName === column) { + return true; + } + } + if (field.name === column) { return true; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-field-metadata.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-field-metadata.service.ts index 00115e2fb36b..6dad51c5d4e0 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-field-metadata.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-field-metadata.service.ts @@ -2,7 +2,6 @@ import { Injectable, Logger } from '@nestjs/common'; import { EntityManager } from 'typeorm'; -import { FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface'; import { WorkspaceMigrationBuilderAction } from 'src/engine/workspace-manager/workspace-migration-builder/interfaces/workspace-migration-builder-action.interface'; import { ComparatorAction, @@ -37,7 +36,6 @@ export class WorkspaceSyncFieldMetadataService { context: WorkspaceSyncContext, manager: EntityManager, storage: WorkspaceSyncStorage, - workspaceFeatureFlagsMap: FeatureFlagMap, ): Promise[]> { const objectMetadataRepository = manager.getRepository(ObjectMetadataEntity); @@ -61,14 +59,12 @@ export class WorkspaceSyncFieldMetadataService { originalObjectMetadataCollection, customObjectMetadataCollection, storage, - workspaceFeatureFlagsMap, ); await this.synchronizeCustomObjectFields( context, customObjectMetadataCollection, storage, - workspaceFeatureFlagsMap, ); this.logger.log('Updating workspace metadata'); @@ -121,14 +117,12 @@ export class WorkspaceSyncFieldMetadataService { originalObjectMetadataCollection: ObjectMetadataEntity[], customObjectMetadataCollection: ObjectMetadataEntity[], storage: WorkspaceSyncStorage, - workspaceFeatureFlagsMap: FeatureFlagMap, ): Promise { // Create standard field metadata map const standardObjectStandardFieldMetadataMap = this.standardFieldFactory.create( standardObjectMetadataDefinitions, context, - workspaceFeatureFlagsMap, ); // Create map of original and standard object metadata by standard ids @@ -145,6 +139,7 @@ export class WorkspaceSyncFieldMetadataService { originalObjectMetadataMap[standardObjectId]; const computedStandardFieldMetadataCollection = computeStandardFields( + context, standardFieldMetadataCollection, originalObjectMetadata, // We need to provide this for generated relations with custom objects @@ -165,20 +160,16 @@ export class WorkspaceSyncFieldMetadataService { context: WorkspaceSyncContext, customObjectMetadataCollection: ObjectMetadataEntity[], storage: WorkspaceSyncStorage, - workspaceFeatureFlagsMap: FeatureFlagMap, ): Promise { // Create standard field metadata collection const customObjectStandardFieldMetadataCollection = - this.standardFieldFactory.create( - CustomWorkspaceEntity, - context, - workspaceFeatureFlagsMap, - ); + this.standardFieldFactory.create(CustomWorkspaceEntity, context); // Loop over all custom objects from the DB and compare their fields with standard fields for (const customObjectMetadata of customObjectMetadataCollection) { // Also, maybe it's better to refactor a bit and move generation part into a separate module ? const standardFieldMetadataCollection = computeStandardFields( + context, customObjectStandardFieldMetadataCollection, customObjectMetadata, ); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-index-metadata.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-index-metadata.service.ts index 0173d171e4a4..b0022b3b2cdb 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-index-metadata.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-index-metadata.service.ts @@ -2,7 +2,6 @@ import { Injectable, Logger } from '@nestjs/common'; import { Any, EntityManager } from 'typeorm'; -import { FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface'; import { WorkspaceMigrationBuilderAction } from 'src/engine/workspace-manager/workspace-migration-builder/interfaces/workspace-migration-builder-action.interface'; import { ComparatorAction } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/comparator.interface'; import { WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface'; @@ -33,7 +32,6 @@ export class WorkspaceSyncIndexMetadataService { context: WorkspaceSyncContext, manager: EntityManager, storage: WorkspaceSyncStorage, - workspaceFeatureFlagsMap: FeatureFlagMap, ): Promise[]> { this.logger.log('Syncing index metadata'); @@ -89,7 +87,6 @@ export class WorkspaceSyncIndexMetadataService { context, originalStandardObjectMetadataMap, originalCustomObjectMetadataMap, - workspaceFeatureFlagsMap, ); const indexComparatorResults = this.workspaceIndexComparator.compare( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-object-metadata-identifiers.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-object-metadata-identifiers.service.ts index 15052c36a72e..49c4eb8cdd1c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-object-metadata-identifiers.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-object-metadata-identifiers.service.ts @@ -3,7 +3,6 @@ import { Injectable } from '@nestjs/common'; import { FieldMetadataType } from 'twenty-shared'; import { EntityManager, Repository } from 'typeorm'; -import { FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface'; import { WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface'; import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; @@ -21,7 +20,6 @@ export class WorkspaceSyncObjectMetadataIdentifiersService { context: WorkspaceSyncContext, manager: EntityManager, _storage: WorkspaceSyncStorage, - workspaceFeatureFlagsMap: FeatureFlagMap, ): Promise { const objectMetadataRepository = manager.getRepository(ObjectMetadataEntity); @@ -32,10 +30,8 @@ export class WorkspaceSyncObjectMetadataIdentifiersService { objectMetadataRepository, ); - const standardObjectMetadataMap = this.createStandardObjectMetadataMap( - context, - workspaceFeatureFlagsMap, - ); + const standardObjectMetadataMap = + this.createStandardObjectMetadataMap(context); await this.processObjectMetadataCollection( originalObjectMetadataCollection, @@ -56,12 +52,10 @@ export class WorkspaceSyncObjectMetadataIdentifiersService { private createStandardObjectMetadataMap( context: WorkspaceSyncContext, - workspaceFeatureFlagsMap: FeatureFlagMap, ): Record { const standardObjectMetadataCollection = this.standardObjectFactory.create( standardObjectMetadataDefinitions, context, - workspaceFeatureFlagsMap, ); return mapObjectMetadataByUniqueIdentifier( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-object-metadata.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-object-metadata.service.ts index 1c056e5d1c72..ed4fcaf2bc58 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-object-metadata.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-object-metadata.service.ts @@ -2,7 +2,6 @@ import { Injectable, Logger } from '@nestjs/common'; import { EntityManager } from 'typeorm'; -import { FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface'; import { WorkspaceMigrationBuilderAction } from 'src/engine/workspace-manager/workspace-migration-builder/interfaces/workspace-migration-builder-action.interface'; import { ComparatorAction } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/comparator.interface'; import { WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface'; @@ -33,7 +32,6 @@ export class WorkspaceSyncObjectMetadataService { context: WorkspaceSyncContext, manager: EntityManager, storage: WorkspaceSyncStorage, - workspaceFeatureFlagsMap: FeatureFlagMap, ): Promise[]> { const objectMetadataRepository = manager.getRepository(ObjectMetadataEntity); @@ -83,7 +81,6 @@ export class WorkspaceSyncObjectMetadataService { const standardObjectMetadataCollection = this.standardObjectFactory.create( standardObjectMetadataDefinitions, context, - workspaceFeatureFlagsMap, ); // Create map of original and standard object metadata by standard ids diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-relation-metadata.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-relation-metadata.service.ts index 216edeebf696..76fc12f93b27 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-relation-metadata.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-relation-metadata.service.ts @@ -2,22 +2,21 @@ import { Injectable } from '@nestjs/common'; import { EntityManager } from 'typeorm'; -import { WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface'; -import { FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface'; -import { ComparatorAction } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/comparator.interface'; import { WorkspaceMigrationBuilderAction } from 'src/engine/workspace-manager/workspace-migration-builder/interfaces/workspace-migration-builder-action.interface'; +import { ComparatorAction } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/comparator.interface'; +import { WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { RelationMetadataEntity } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity'; -import { mapObjectMetadataByUniqueIdentifier } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/sync-metadata.util'; -import { StandardRelationFactory } from 'src/engine/workspace-manager/workspace-sync-metadata/factories/standard-relation.factory'; -import { WorkspaceRelationComparator } from 'src/engine/workspace-manager/workspace-sync-metadata/comparators/workspace-relation.comparator'; -import { WorkspaceMetadataUpdaterService } from 'src/engine/workspace-manager/workspace-sync-metadata/services/workspace-metadata-updater.service'; import { WorkspaceMigrationEntity } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity'; -import { WorkspaceSyncStorage } from 'src/engine/workspace-manager/workspace-sync-metadata/storage/workspace-sync.storage'; +import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-entity'; import { WorkspaceMigrationRelationFactory } from 'src/engine/workspace-manager/workspace-migration-builder/factories/workspace-migration-relation.factory'; +import { WorkspaceRelationComparator } from 'src/engine/workspace-manager/workspace-sync-metadata/comparators/workspace-relation.comparator'; +import { StandardRelationFactory } from 'src/engine/workspace-manager/workspace-sync-metadata/factories/standard-relation.factory'; +import { WorkspaceMetadataUpdaterService } from 'src/engine/workspace-manager/workspace-sync-metadata/services/workspace-metadata-updater.service'; import { standardObjectMetadataDefinitions } from 'src/engine/workspace-manager/workspace-sync-metadata/standard-objects'; -import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-entity'; +import { WorkspaceSyncStorage } from 'src/engine/workspace-manager/workspace-sync-metadata/storage/workspace-sync.storage'; +import { mapObjectMetadataByUniqueIdentifier } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/sync-metadata.util'; @Injectable() export class WorkspaceSyncRelationMetadataService { @@ -32,7 +31,6 @@ export class WorkspaceSyncRelationMetadataService { context: WorkspaceSyncContext, manager: EntityManager, storage: WorkspaceSyncStorage, - workspaceFeatureFlagsMap: FeatureFlagMap, ): Promise[]> { const objectMetadataRepository = manager.getRepository(ObjectMetadataEntity); @@ -76,7 +74,6 @@ export class WorkspaceSyncRelationMetadataService { standardObjectMetadataDefinitions, context, originalObjectMetadataMap, - workspaceFeatureFlagsMap, ); const customRelationMetadataCollection = @@ -87,7 +84,6 @@ export class WorkspaceSyncRelationMetadataService { })), context, originalObjectMetadataMap, - workspaceFeatureFlagsMap, ); const relationComparatorResults = this.workspaceRelationComparator.compare( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/utils/compute-standard-fields.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/utils/compute-standard-fields.util.ts index e2aa820c43b4..ca09696f4633 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/utils/compute-standard-fields.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/utils/compute-standard-fields.util.ts @@ -5,7 +5,9 @@ import { PartialComputedFieldMetadata, PartialFieldMetadata, } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/partial-field-metadata.interface'; +import { WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { createForeignKeyDeterministicUuid, @@ -13,6 +15,7 @@ import { } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/create-deterministic-uuid.util'; export const computeStandardFields = ( + context: WorkspaceSyncContext, standardFieldMetadataCollection: ( | PartialFieldMetadata | PartialComputedFieldMetadata @@ -22,6 +25,9 @@ export const computeStandardFields = ( ): ComputedPartialFieldMetadata[] => { const fields: ComputedPartialFieldMetadata[] = []; + const isNewRelationEnabled = + context.featureFlags[FeatureFlagKey.IsNewRelationEnabled]; + for (const partialFieldMetadata of standardFieldMetadataCollection) { // Relation from standard object to custom object if ('argsFactory' in partialFieldMetadata) { @@ -52,18 +58,22 @@ export const computeStandardFields = ( defaultValue: null, }); - // Foreign key - fields.push({ - ...rest, - standardId: foreignKeyStandardId, - name: joinColumn, - type: FieldMetadataType.UUID, - label: `${data.label} ID (foreign key)`, - description: `${data.description} id foreign key`, - defaultValue: null, - icon: undefined, - isSystem: true, - }); + // Only add foreign key if new relation is disabled + // As new relation will no longer create the field metadata related to foreign key + if (!isNewRelationEnabled) { + // Foreign key + fields.push({ + ...rest, + standardId: foreignKeyStandardId, + name: joinColumn, + type: FieldMetadataType.UUID, + label: `${data.label} ID (foreign key)`, + description: `${data.description} id foreign key`, + defaultValue: null, + icon: undefined, + isSystem: true, + }); + } } } else { // Relation from standard object to standard object diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service.ts index ca2b3404bcca..44734f0be0a5 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service.ts @@ -1,12 +1,10 @@ import { Injectable, Logger } from '@nestjs/common'; -import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; +import { InjectDataSource } from '@nestjs/typeorm'; -import { DataSource, QueryFailedError, Repository } from 'typeorm'; +import { DataSource, QueryFailedError } from 'typeorm'; import { WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface'; -import { FeatureFlag } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; -import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; import { WorkspaceMetadataVersionService } from 'src/engine/metadata-modules/workspace-metadata-version/services/workspace-metadata-version.service'; import { WorkspaceMigrationEntity } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity'; import { WorkspaceMigrationRunnerService } from 'src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service'; @@ -28,7 +26,6 @@ export class WorkspaceSyncMetadataService { constructor( @InjectDataSource('metadata') private readonly metadataDataSource: DataSource, - private readonly featureFlagService: FeatureFlagService, private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService, private readonly workspaceSyncObjectMetadataService: WorkspaceSyncObjectMetadataService, private readonly workspaceSyncRelationMetadataService: WorkspaceSyncRelationMetadataService, @@ -36,8 +33,6 @@ export class WorkspaceSyncMetadataService { private readonly workspaceSyncIndexMetadataService: WorkspaceSyncIndexMetadataService, private readonly workspaceSyncObjectMetadataIdentifiersService: WorkspaceSyncObjectMetadataIdentifiersService, private readonly workspaceMetadataVersionService: WorkspaceMetadataVersionService, - @InjectRepository(FeatureFlag, 'core') - private readonly featureFlagRepository: Repository, ) {} /** @@ -71,12 +66,6 @@ export class WorkspaceSyncMetadataService { WorkspaceMigrationEntity, ); - // Retrieve feature flags - const workspaceFeatureFlagsMap = - await this.featureFlagService.getWorkspaceFeatureFlagsMap( - context.workspaceId, - ); - this.logger.log('Syncing standard objects and fields metadata'); // 1 - Sync standard objects @@ -87,7 +76,6 @@ export class WorkspaceSyncMetadataService { context, manager, storage, - workspaceFeatureFlagsMap, ); const workspaceObjectMigrationsEnd = performance.now(); @@ -103,7 +91,6 @@ export class WorkspaceSyncMetadataService { context, manager, storage, - workspaceFeatureFlagsMap, ); const workspaceFieldMigrationsEnd = performance.now(); @@ -119,7 +106,6 @@ export class WorkspaceSyncMetadataService { context, manager, storage, - workspaceFeatureFlagsMap, ); const workspaceRelationMigrationsEnd = performance.now(); @@ -135,7 +121,6 @@ export class WorkspaceSyncMetadataService { context, manager, storage, - workspaceFeatureFlagsMap, ); const workspaceIndexMigrationsEnd = performance.now(); @@ -151,7 +136,6 @@ export class WorkspaceSyncMetadataService { context, manager, storage, - workspaceFeatureFlagsMap, ); const workspaceObjectMetadataIdentifiersEnd = performance.now();