feat: refactor schema builder and resolver builder (#2215)

* feat: wip refactor schema builder

* feat: wip store types and first queries generation

* feat: refactor schema-builder and resolver-builder

* fix: clean & small type fix

* fix: avoid breaking change

* fix: remove util from pg-graphql classes

* fix: required default fields

* Refactor frontend accordingly

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
Jérémy M
2023-11-03 17:16:37 +01:00
committed by GitHub
parent aba3fd454b
commit 1ed4965a95
216 changed files with 3215 additions and 2028 deletions

View File

@ -1,18 +1,24 @@
/* eslint-disable @typescript-eslint/no-empty-function */
import { Injectable } from '@nestjs/common';
import { GraphQLSchema } from 'graphql';
import { GraphQLSchema, printSchema } from 'graphql';
import { makeExecutableSchema } from '@graphql-tools/schema';
import { gql } from 'graphql-tag';
import { DataSourceMetadataService } from 'src/metadata/data-source-metadata/data-source-metadata.service';
import { ObjectMetadataService } from 'src/metadata/object-metadata/services/object-metadata.service';
import { SchemaBuilderService } from './schema-builder/schema-builder.service';
import { GraphQLSchemaFactory } from './schema-builder/graphql-schema.factory';
import { resolverBuilderMethodNames } from './resolver-builder/factories/factories';
import { ResolverFactory } from './resolver-builder/resolver.factory';
@Injectable()
export class TenantService {
constructor(
private readonly schemaBuilderService: SchemaBuilderService,
private readonly dataSourceMetadataService: DataSourceMetadataService,
private readonly objectMetadataService: ObjectMetadataService,
private readonly graphQLSchemaFactory: GraphQLSchemaFactory,
private readonly resolverFactory: ResolverFactory,
) {}
async createTenantSchema(workspaceId: string | undefined) {
@ -30,16 +36,30 @@ export class TenantService {
return new GraphQLSchema({});
}
const dataSourceMetadata = dataSourcesMetadata[0];
const objectMetadata =
await this.objectMetadataService.getObjectMetadataFromDataSourceId(
dataSourceMetadata.id,
const objectMetadataCollection =
await this.objectMetadataService.getObjectMetadataFromWorkspaceId(
workspaceId,
);
return this.schemaBuilderService.generateSchema(
workspaceId,
objectMetadata,
const autoGeneratedSchema = await this.graphQLSchemaFactory.create(
objectMetadataCollection,
resolverBuilderMethodNames,
);
const autoGeneratedResolvers = await this.resolverFactory.create(
workspaceId,
objectMetadataCollection,
resolverBuilderMethodNames,
);
// TODO: Cache the generate type definitions
const typeDefs = printSchema(autoGeneratedSchema);
const executableSchema = makeExecutableSchema({
typeDefs: gql`
${typeDefs}
`,
resolvers: autoGeneratedResolvers,
});
return executableSchema;
}
}