Remove old relations (#11993)

This is a first PR to remove old relation logic

Next steps:
- remove relationMetadata from cache
- remove relationMetadata table content and structure
- refactor relationDefinition to leverage field.settings instead
This commit is contained in:
Charles Bochet
2025-05-13 11:28:22 +02:00
committed by GitHub
parent 9ed6edc005
commit 45d4845b26
63 changed files with 223 additions and 2016 deletions

View File

@ -1,3 +1 @@
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
export const DEFAULT_FEATURE_FLAGS = [FeatureFlagKey.IsNewRelationEnabled];
export const DEFAULT_FEATURE_FLAGS = [];

View File

@ -13,11 +13,8 @@ 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 { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity';
import { metadataArgsStorage } from 'src/engine/twenty-orm/storage/metadata-args.storage';
import { getJoinColumn } from 'src/engine/twenty-orm/utils/get-join-column.util';
import { createDeterministicUuid } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/create-deterministic-uuid.util';
import { isGatedAndNotEnabled } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/is-gate-and-not-enabled.util';
@Injectable()
@ -169,21 +166,7 @@ export class StandardFieldFactory {
workspaceRelationMetadataArgs: WorkspaceRelationMetadataArgs,
context: WorkspaceSyncContext,
): PartialFieldMetadata[] {
const isNewRelationEnabled =
context.featureFlags[FeatureFlagKey.IsNewRelationEnabled];
const fieldMetadataCollection: PartialFieldMetadata[] = [];
const foreignKeyStandardId = createDeterministicUuid(
workspaceRelationMetadataArgs.standardId,
);
const joinColumnMetadataArgsCollection =
metadataArgsStorage.filterJoinColumns(
workspaceRelationMetadataArgs.target,
);
const joinColumn = getJoinColumn(
joinColumnMetadataArgsCollection,
workspaceRelationMetadataArgs,
);
if (
isGatedAndNotEnabled(
@ -194,28 +177,6 @@ export class StandardFieldFactory {
return [];
}
// We don't want to create the join column field metadata for new relation
if (!isNewRelationEnabled && joinColumn) {
fieldMetadataCollection.push({
type: FieldMetadataType.UUID,
standardId: foreignKeyStandardId,
name: joinColumn,
label: `${workspaceRelationMetadataArgs.label} id (foreign key)`,
description: `${workspaceRelationMetadataArgs.description} id foreign key`,
icon: workspaceRelationMetadataArgs.icon,
defaultValue: null,
options: undefined,
settings: undefined,
workspaceId: context.workspaceId,
isCustom: false,
isSystem: true,
isNullable: workspaceRelationMetadataArgs.isNullable,
isUnique:
workspaceRelationMetadataArgs.type === RelationType.ONE_TO_ONE,
isActive: workspaceRelationMetadataArgs.isActive ?? true,
});
}
fieldMetadataCollection.push({
type: FieldMetadataType.RELATION,
standardId: workspaceRelationMetadataArgs.standardId,

View File

@ -17,7 +17,6 @@ import { PartialFieldMetadata } from 'src/engine/workspace-manager/workspace-syn
import { PartialIndexMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/partial-index-metadata.interface';
import { UpdaterOptions } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/updater-options.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';
@ -369,15 +368,6 @@ 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,
@ -391,7 +381,6 @@ export class WorkspaceMetadataUpdaterService {
.find((object) => object.id === indexMetadata.objectMetadataId)
?.fields.find((field) => {
if (
isNewRelationEnabled &&
isFieldMetadataEntityOfType(field, FieldMetadataType.RELATION)
) {
if (field.settings?.joinColumnName === column) {

View File

@ -1,5 +1,3 @@
import { FieldMetadataType } from 'twenty-shared/types';
import {
ComputedPartialFieldMetadata,
PartialComputedFieldMetadata,
@ -7,12 +5,8 @@ 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 { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import {
createForeignKeyDeterministicUuid,
createRelationDeterministicUuid,
} from 'src/engine/workspace-manager/workspace-sync-metadata/utils/create-deterministic-uuid.util';
import { createRelationDeterministicUuid } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/create-deterministic-uuid.util';
export const computeStandardFields = (
context: WorkspaceSyncContext,
@ -25,9 +19,6 @@ 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) {
@ -39,10 +30,6 @@ export const computeStandardFields = (
objectId: customObjectMetadata.id,
standardId: data.standardId,
});
const foreignKeyStandardId = createForeignKeyDeterministicUuid({
objectId: customObjectMetadata.id,
standardId: data.standardId,
});
if (!joinColumn) {
throw new Error(
@ -57,23 +44,6 @@ export const computeStandardFields = (
standardId: relationStandardId,
defaultValue: null,
});
// 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

View File

@ -5,7 +5,6 @@ import { DataSource, QueryFailedError } from 'typeorm';
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 { 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 {
@ -70,12 +69,6 @@ export class WorkspaceSyncMetadataService {
const manager = queryRunner.manager;
try {
const isNewRelationEnabled =
await this.featureFlagService.isFeatureEnabled(
FeatureFlagKey.IsNewRelationEnabled,
context.workspaceId,
);
const workspaceMigrationRepository = manager.getRepository(
WorkspaceMigrationEntity,
);
@ -127,21 +120,12 @@ export class WorkspaceSyncMetadataService {
let workspaceRelationMigrations: Partial<WorkspaceMigrationEntity>[] = [];
if (isNewRelationEnabled) {
workspaceRelationMigrations =
await this.workspaceSyncFieldMetadataRelationService.synchronize(
context,
manager,
storage,
);
} else {
workspaceRelationMigrations =
await this.workspaceSyncRelationMetadataService.synchronize(
context,
manager,
storage,
);
}
workspaceRelationMigrations =
await this.workspaceSyncFieldMetadataRelationService.synchronize(
context,
manager,
storage,
);
const workspaceRelationMigrationsEnd = performance.now();
@ -149,24 +133,22 @@ export class WorkspaceSyncMetadataService {
`Workspace relation migrations took ${workspaceRelationMigrationsEnd - workspaceRelationMigrationsStart}ms`,
);
let workspaceIndexMigrations: Partial<WorkspaceMigrationEntity>[] = [];
const workspaceIndexMigrations: Partial<WorkspaceMigrationEntity>[] = [];
// 4 - Sync standard indexes on standard objects
if (!isNewRelationEnabled) {
const workspaceIndexMigrationsStart = performance.now();
const workspaceIndexMigrationsStart = performance.now();
workspaceIndexMigrations =
await this.workspaceSyncIndexMetadataService.synchronize(
context,
manager,
storage,
);
const workspaceIndexMigrationsEnd = performance.now();
// workspaceIndexMigrations =
// await this.workspaceSyncIndexMetadataService.synchronize(
// context,
// manager,
// storage,
// );
const workspaceIndexMigrationsEnd = performance.now();
this.logger.log(
`Workspace index migrations took ${workspaceIndexMigrationsEnd - workspaceIndexMigrationsStart}ms`,
);
}
this.logger.log(
`Workspace index migrations took ${workspaceIndexMigrationsEnd - workspaceIndexMigrationsStart}ms`,
);
// 5 - Sync standard object metadata identifiers, does not need to return nor apply migrations
const workspaceObjectMetadataIdentifiersStart = performance.now();