twenty / packages /twenty-server /src /engine /api /graphql /workspace-schema.factory.ts
Jules
Initial clean CRM deployment with prebuilt assets
d9494a5
Raw
History Blame Contribute Delete
2.42 kB
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<GraphQLSchema> {
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;
}
}