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:
@ -26,10 +26,7 @@ type EntitySchemaColumnMap = {
|
||||
|
||||
@Injectable()
|
||||
export class EntitySchemaColumnFactory {
|
||||
create(
|
||||
fieldMetadataMapByName: FieldMetadataMap,
|
||||
isNewRelationEnabled: boolean,
|
||||
): EntitySchemaColumnMap {
|
||||
create(fieldMetadataMapByName: FieldMetadataMap): EntitySchemaColumnMap {
|
||||
let entitySchemaColumnMap: EntitySchemaColumnMap = {};
|
||||
|
||||
const fieldMetadataCollection = Object.values(fieldMetadataMapByName);
|
||||
@ -43,57 +40,28 @@ export class EntitySchemaColumnFactory {
|
||||
FieldMetadataType.RELATION,
|
||||
)
|
||||
) {
|
||||
if (!isNewRelationEnabled) {
|
||||
const relationMetadata =
|
||||
fieldMetadata.fromRelationMetadata ??
|
||||
fieldMetadata.toRelationMetadata;
|
||||
|
||||
if (!relationMetadata) {
|
||||
throw new Error(
|
||||
`Relation metadata is missing for field ${fieldMetadata.name}`,
|
||||
);
|
||||
}
|
||||
|
||||
const joinColumnKey = fieldMetadata.name + 'Id';
|
||||
const joinColumn = fieldMetadataCollection.find(
|
||||
(field) => field.name === joinColumnKey,
|
||||
)
|
||||
? joinColumnKey
|
||||
: null;
|
||||
|
||||
if (joinColumn) {
|
||||
entitySchemaColumnMap[joinColumn] = {
|
||||
name: joinColumn,
|
||||
type: 'uuid',
|
||||
nullable: fieldMetadata.isNullable,
|
||||
};
|
||||
}
|
||||
|
||||
continue;
|
||||
} else {
|
||||
const isManyToOneRelation =
|
||||
fieldMetadata.settings?.relationType === RelationType.MANY_TO_ONE;
|
||||
const joinColumnName = fieldMetadata.settings?.joinColumnName;
|
||||
|
||||
if (!isManyToOneRelation) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isDefined(joinColumnName)) {
|
||||
throw new TwentyORMException(
|
||||
`Field ${fieldMetadata.id} of type ${fieldMetadata.type} is a many to one relation but does not have a join column name`,
|
||||
TwentyORMExceptionCode.MALFORMED_METADATA,
|
||||
);
|
||||
}
|
||||
|
||||
entitySchemaColumnMap[joinColumnName] = {
|
||||
name: joinColumnName,
|
||||
type: 'uuid',
|
||||
nullable: fieldMetadata.isNullable,
|
||||
};
|
||||
const isManyToOneRelation =
|
||||
fieldMetadata.settings?.relationType === RelationType.MANY_TO_ONE;
|
||||
const joinColumnName = fieldMetadata.settings?.joinColumnName;
|
||||
|
||||
if (!isManyToOneRelation) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isDefined(joinColumnName)) {
|
||||
throw new TwentyORMException(
|
||||
`Field ${fieldMetadata.id} of type ${fieldMetadata.type} is a many to one relation but does not have a join column name`,
|
||||
TwentyORMExceptionCode.MALFORMED_METADATA,
|
||||
);
|
||||
}
|
||||
|
||||
entitySchemaColumnMap[joinColumnName] = {
|
||||
name: joinColumnName,
|
||||
type: 'uuid',
|
||||
nullable: fieldMetadata.isNullable,
|
||||
};
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isCompositeFieldMetadataType(fieldMetadata.type)) {
|
||||
|
||||
@ -5,7 +5,6 @@ import { EntitySchemaRelationOptions } from 'typeorm';
|
||||
|
||||
import { FieldMetadataMap } from 'src/engine/metadata-modules/types/field-metadata-map';
|
||||
import { ObjectMetadataMaps } from 'src/engine/metadata-modules/types/object-metadata-maps';
|
||||
import { determineRelationDetails } from 'src/engine/twenty-orm/utils/determine-relation-details.util';
|
||||
import { determineSchemaRelationDetails } from 'src/engine/twenty-orm/utils/determine-schema-relation-details.util';
|
||||
import { isFieldMetadataInterfaceOfType } from 'src/engine/utils/is-field-metadata-of-type.util';
|
||||
|
||||
@ -20,7 +19,6 @@ export class EntitySchemaRelationFactory {
|
||||
async create(
|
||||
fieldMetadataMapByName: FieldMetadataMap,
|
||||
objectMetadataMaps: ObjectMetadataMaps,
|
||||
isNewRelationEnabled: boolean,
|
||||
): Promise<EntitySchemaRelationMap> {
|
||||
const entitySchemaRelationMap: EntitySchemaRelationMap = {};
|
||||
|
||||
@ -36,48 +34,23 @@ export class EntitySchemaRelationFactory {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isNewRelationEnabled) {
|
||||
const relationMetadata =
|
||||
fieldMetadata.fromRelationMetadata ??
|
||||
fieldMetadata.toRelationMetadata;
|
||||
|
||||
if (!relationMetadata) {
|
||||
throw new Error(
|
||||
`Relation metadata is missing for field ${fieldMetadata.name}`,
|
||||
);
|
||||
}
|
||||
|
||||
const relationDetails = await determineRelationDetails(
|
||||
fieldMetadata,
|
||||
relationMetadata,
|
||||
objectMetadataMaps,
|
||||
if (!fieldMetadata.settings) {
|
||||
throw new Error(
|
||||
`Field metadata settings are missing for field ${fieldMetadata.name}`,
|
||||
);
|
||||
|
||||
entitySchemaRelationMap[fieldMetadata.name] = {
|
||||
type: relationDetails.relationType,
|
||||
target: relationDetails.target,
|
||||
inverseSide: relationDetails.inverseSide,
|
||||
joinColumn: relationDetails.joinColumn,
|
||||
} satisfies EntitySchemaRelationOptions;
|
||||
} else {
|
||||
if (!fieldMetadata.settings) {
|
||||
throw new Error(
|
||||
`Field metadata settings are missing for field ${fieldMetadata.name}`,
|
||||
);
|
||||
}
|
||||
|
||||
const schemaRelationDetails = await determineSchemaRelationDetails(
|
||||
fieldMetadata,
|
||||
objectMetadataMaps,
|
||||
);
|
||||
|
||||
entitySchemaRelationMap[fieldMetadata.name] = {
|
||||
type: schemaRelationDetails.relationType,
|
||||
target: schemaRelationDetails.target,
|
||||
inverseSide: schemaRelationDetails.inverseSide,
|
||||
joinColumn: schemaRelationDetails.joinColumn,
|
||||
} satisfies EntitySchemaRelationOptions;
|
||||
}
|
||||
|
||||
const schemaRelationDetails = await determineSchemaRelationDetails(
|
||||
fieldMetadata,
|
||||
objectMetadataMaps,
|
||||
);
|
||||
|
||||
entitySchemaRelationMap[fieldMetadata.name] = {
|
||||
type: schemaRelationDetails.relationType,
|
||||
target: schemaRelationDetails.target,
|
||||
inverseSide: schemaRelationDetails.inverseSide,
|
||||
joinColumn: schemaRelationDetails.joinColumn,
|
||||
} satisfies EntitySchemaRelationOptions;
|
||||
}
|
||||
|
||||
return entitySchemaRelationMap;
|
||||
|
||||
@ -2,7 +2,6 @@ import { Injectable } from '@nestjs/common';
|
||||
|
||||
import { EntitySchema } from 'typeorm';
|
||||
|
||||
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 { ObjectMetadataItemWithFieldMaps } from 'src/engine/metadata-modules/types/object-metadata-item-with-field-maps';
|
||||
import { ObjectMetadataMaps } from 'src/engine/metadata-modules/types/object-metadata-maps';
|
||||
@ -25,20 +24,13 @@ export class EntitySchemaFactory {
|
||||
objectMetadata: ObjectMetadataItemWithFieldMaps,
|
||||
objectMetadataMaps: ObjectMetadataMaps,
|
||||
): Promise<EntitySchema> {
|
||||
const isNewRelationEnabled = await this.featureFlagService.isFeatureEnabled(
|
||||
FeatureFlagKey.IsNewRelationEnabled,
|
||||
workspaceId,
|
||||
);
|
||||
|
||||
const columns = this.entitySchemaColumnFactory.create(
|
||||
objectMetadata.fieldsByName,
|
||||
isNewRelationEnabled,
|
||||
);
|
||||
|
||||
const relations = await this.entitySchemaRelationFactory.create(
|
||||
objectMetadata.fieldsByName,
|
||||
objectMetadataMaps,
|
||||
isNewRelationEnabled,
|
||||
);
|
||||
|
||||
const entitySchema = new EntitySchema({
|
||||
|
||||
Reference in New Issue
Block a user