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

@ -36,7 +36,6 @@ export class InputTypeDefinitionFactory {
objectMetadata: ObjectMetadataInterface,
kind: InputTypeDefinitionKind,
options: WorkspaceBuildSchemaOptions,
isNewRelationEnabled = false,
): InputTypeDefinition {
const inputType = new GraphQLInputObjectType({
name: `${pascalCase(objectMetadata.nameSingular)}${kind.toString()}Input`,
@ -59,7 +58,6 @@ export class InputTypeDefinitionFactory {
kind,
options,
this.inputTypeFactory,
isNewRelationEnabled,
),
and: {
type: andOrType,
@ -83,7 +81,6 @@ export class InputTypeDefinitionFactory {
kind,
options,
this.inputTypeFactory,
isNewRelationEnabled,
);
}
},

View File

@ -30,7 +30,6 @@ export class ObjectTypeDefinitionFactory {
objectMetadata: ObjectMetadataInterface,
kind: ObjectTypeDefinitionKind,
options: WorkspaceBuildSchemaOptions,
isNewRelationEnabled = false,
): ObjectTypeDefinition {
return {
target: objectMetadata.id,
@ -43,7 +42,6 @@ export class ObjectTypeDefinitionFactory {
kind,
options,
this.outputTypeFactory,
isNewRelationEnabled,
),
}),
};

View File

@ -1,7 +1,5 @@
import { Injectable, Logger } from '@nestjs/common';
import chalk from 'chalk';
import { CompositeType } from 'src/engine/metadata-modules/field-metadata/interfaces/composite-type.interface';
import { ObjectMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/object-metadata.interface';
@ -10,13 +8,10 @@ import { CompositeInputTypeDefinitionFactory } from 'src/engine/api/graphql/work
import { CompositeObjectTypeDefinitionFactory } from 'src/engine/api/graphql/workspace-schema-builder/factories/composite-object-type-definition.factory';
import { EnumTypeDefinitionFactory } from 'src/engine/api/graphql/workspace-schema-builder/factories/enum-type-definition.factory';
import { ExtendObjectTypeDefinitionV2Factory } from 'src/engine/api/graphql/workspace-schema-builder/factories/extend-object-type-definition-v2.factory';
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 { ConnectionTypeDefinitionFactory } from './factories/connection-type-definition.factory';
import { EdgeTypeDefinitionFactory } from './factories/edge-type-definition.factory';
import { ExtendObjectTypeDefinitionFactory } from './factories/extend-object-type-definition.factory';
import {
InputTypeDefinitionFactory,
InputTypeDefinitionKind,
@ -43,24 +38,17 @@ export class TypeDefinitionsGenerator {
private readonly compositeInputTypeDefinitionFactory: CompositeInputTypeDefinitionFactory,
private readonly edgeTypeDefinitionFactory: EdgeTypeDefinitionFactory,
private readonly connectionTypeDefinitionFactory: ConnectionTypeDefinitionFactory,
private readonly extendObjectTypeDefinitionFactory: ExtendObjectTypeDefinitionFactory,
private readonly extendObjectTypeDefinitionV2Factory: ExtendObjectTypeDefinitionV2Factory,
private readonly featureFlagService: FeatureFlagService,
) {}
async generate(
objectMetadataCollection: ObjectMetadataInterface[],
options: WorkspaceBuildSchemaOptions,
isNewRelationEnabled: boolean,
) {
// Generate composite type objects first because they can be used in dynamic objects
await this.generateCompositeTypeDefs(options);
// Generate metadata objects
await this.generateMetadataTypeDefs(
objectMetadataCollection,
options,
isNewRelationEnabled,
);
await this.generateMetadataTypeDefs(objectMetadataCollection, options);
}
/**
@ -160,7 +148,6 @@ export class TypeDefinitionsGenerator {
private async generateMetadataTypeDefs(
dynamicObjectMetadataCollection: ObjectMetadataInterface[],
options: WorkspaceBuildSchemaOptions,
isNewRelationEnabled: boolean,
) {
this.logger.log(
`Generating metadata objects: [${dynamicObjectMetadataCollection
@ -170,17 +157,9 @@ export class TypeDefinitionsGenerator {
// Generate dynamic objects
this.generateEnumTypeDefs(dynamicObjectMetadataCollection, options);
this.generateObjectTypeDefs(
dynamicObjectMetadataCollection,
options,
isNewRelationEnabled,
);
this.generateObjectTypeDefs(dynamicObjectMetadataCollection, options);
this.generatePaginationTypeDefs(dynamicObjectMetadataCollection, options);
this.generateInputTypeDefs(
dynamicObjectMetadataCollection,
options,
isNewRelationEnabled,
);
this.generateInputTypeDefs(dynamicObjectMetadataCollection, options);
await this.generateExtendedObjectTypeDefs(
dynamicObjectMetadataCollection,
options,
@ -190,14 +169,12 @@ export class TypeDefinitionsGenerator {
private generateObjectTypeDefs(
objectMetadataCollection: ObjectMetadataInterface[] | CompositeType[],
options: WorkspaceBuildSchemaOptions,
isNewRelationEnabled: boolean,
) {
const objectTypeDefs = objectMetadataCollection.map((objectMetadata) =>
this.objectTypeDefinitionFactory.create(
objectMetadata,
ObjectTypeDefinitionKind.Plain,
options,
isNewRelationEnabled,
),
);
@ -225,7 +202,6 @@ export class TypeDefinitionsGenerator {
private generateInputTypeDefs(
objectMetadataCollection: ObjectMetadataInterface[],
options: WorkspaceBuildSchemaOptions,
isNewRelationEnabled: boolean,
) {
const inputTypeDefs = objectMetadataCollection
.map((objectMetadata) => {
@ -243,28 +219,24 @@ export class TypeDefinitionsGenerator {
objectMetadata,
InputTypeDefinitionKind.Create,
options,
isNewRelationEnabled,
),
// Input type for update
this.inputTypeDefinitionFactory.create(
optionalExtendedObjectMetadata,
InputTypeDefinitionKind.Update,
options,
isNewRelationEnabled,
),
// Filter input type
this.inputTypeDefinitionFactory.create(
optionalExtendedObjectMetadata,
InputTypeDefinitionKind.Filter,
options,
isNewRelationEnabled,
),
// OrderBy input type
this.inputTypeDefinitionFactory.create(
optionalExtendedObjectMetadata,
InputTypeDefinitionKind.OrderBy,
options,
isNewRelationEnabled,
),
];
})
@ -300,34 +272,14 @@ export class TypeDefinitionsGenerator {
throw new Error('Workspace ID not found');
}
const isNewRelationEnabled = await this.featureFlagService.isFeatureEnabled(
FeatureFlagKey.IsNewRelationEnabled,
workspaceId,
const objectTypeDefs = objectMetadataCollectionWithCompositeFields.map(
(objectMetadata) =>
this.extendObjectTypeDefinitionV2Factory.create(
objectMetadata,
options,
),
);
if (!isNewRelationEnabled) {
const objectTypeDefs = objectMetadataCollectionWithCompositeFields.map(
(objectMetadata) =>
this.extendObjectTypeDefinitionFactory.create(
objectMetadata,
options,
),
);
this.typeDefinitionsStorage.addObjectTypes(objectTypeDefs);
} else {
this.logger.log(
chalk.green('Extend object type definition with new relation fields'),
);
const objectTypeDefsV2 = objectMetadataCollectionWithCompositeFields.map(
(objectMetadata) =>
this.extendObjectTypeDefinitionV2Factory.create(
objectMetadata,
options,
),
);
this.typeDefinitionsStorage.addObjectTypes(objectTypeDefsV2);
}
this.typeDefinitionsStorage.addObjectTypes(objectTypeDefs);
}
}

View File

@ -41,7 +41,6 @@ export const generateFields = <
kind: T,
options: WorkspaceBuildSchemaOptions,
typeFactory: TypeFactory<T>,
isNewRelationEnabled = false,
): T extends InputTypeDefinitionKind
? GraphQLInputFieldConfigMap
: GraphQLFieldConfigMap<any, any> => {
@ -53,8 +52,7 @@ export const generateFields = <
fieldMetadata,
FieldMetadataType.RELATION,
) &&
(fieldMetadata.settings?.relationType !== RelationType.MANY_TO_ONE ||
!isNewRelationEnabled)
fieldMetadata.settings?.relationType !== RelationType.MANY_TO_ONE
) {
continue;
}

View File

@ -25,13 +25,11 @@ export class WorkspaceGraphQLSchemaFactory {
objectMetadataCollection: ObjectMetadataInterface[],
workspaceResolverBuilderMethods: WorkspaceResolverBuilderMethods,
options: WorkspaceBuildSchemaOptions = {},
isNewRelationEnabled = false,
): Promise<GraphQLSchema> {
// Generate type definitions
await this.typeDefinitionsGenerator.generate(
objectMetadataCollection,
options,
isNewRelationEnabled,
);
// Generate schema

View File

@ -1,7 +1,6 @@
import { Module } from '@nestjs/common';
import { WorkspaceResolverBuilderModule } from 'src/engine/api/graphql/workspace-resolver-builder/workspace-resolver-builder.module';
import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module';
import { ObjectMetadataModule } from 'src/engine/metadata-modules/object-metadata/object-metadata.module';
import { TypeDefinitionsGenerator } from './type-definitions.generator';
@ -12,11 +11,7 @@ import { TypeMapperService } from './services/type-mapper.service';
import { TypeDefinitionsStorage } from './storages/type-definitions.storage';
@Module({
imports: [
ObjectMetadataModule,
FeatureFlagModule,
WorkspaceResolverBuilderModule,
],
imports: [ObjectMetadataModule, WorkspaceResolverBuilderModule],
providers: [
TypeDefinitionsStorage,
TypeMapperService,