import { Injectable } from '@nestjs/common'; import { makeExecutableSchema } from '@graphql-tools/schema'; import { GraphQLSchema } from 'graphql'; import { gql } from 'graphql-tag'; import { isDefined } from 'twenty-shared/utils'; import { ScalarsExplorerService } from 'src/engine/api/graphql/services/scalars-explorer.service'; import { WorkspaceGraphqlSchemaSDLService } from 'src/engine/api/graphql/workspace-graphql-schema-sdl/workspace-graphql-schema-sdl.service'; import { workspaceResolverBuilderMethodNames } from 'src/engine/api/graphql/workspace-resolver-builder/factories/factories'; import { WorkspaceResolverFactory } from 'src/engine/api/graphql/workspace-resolver-builder/workspace-resolver.factory'; import { FlatWorkspace } from 'src/engine/core-modules/workspace/types/flat-workspace.type'; import { buildObjectIdByNameMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/build-object-id-by-name-maps.util'; @Injectable() export class WorkspaceSchemaFactory { constructor( private readonly scalarsExplorerService: ScalarsExplorerService, private readonly workspaceResolverFactory: WorkspaceResolverFactory, private readonly workspaceGraphqlSchemaSDLService: WorkspaceGraphqlSchemaSDLService, ) {} async createGraphQLSchema( workspace: FlatWorkspace, applicationId?: string, ): Promise { const schemaSDLResult = await this.workspaceGraphqlSchemaSDLService.getOrComputeSchemaSDL( workspace, applicationId, ); if (!isDefined(schemaSDLResult)) { return new GraphQLSchema({}); } const { sdl, usedScalarNames, flatObjectMetadataMaps, flatFieldMetadataMaps, flatIndexMaps, } = schemaSDLResult; const { idByNameSingular } = buildObjectIdByNameMaps( flatObjectMetadataMaps, ); const autoGeneratedResolvers = await this.workspaceResolverFactory.create( flatObjectMetadataMaps, flatFieldMetadataMaps, flatIndexMaps, idByNameSingular, workspaceResolverBuilderMethodNames, ); const scalarsResolvers = this.scalarsExplorerService.getScalarResolvers(usedScalarNames); const executableSchema = makeExecutableSchema({ typeDefs: gql` ${sdl} `, resolvers: { ...scalarsResolvers, ...autoGeneratedResolvers, }, }); return executableSchema; } }