* Convert metadata tables to camelCase * datasourcemetadataid to datasourceid * refactor metadata folders * fix command * move commands out of metadata * fix seed * rename objectId and fieldId in objectMetadataId and fieldMetadataId in FE * fix field-metadata * Fix * Fix * remove logs --------- Co-authored-by: Charles Bochet <charles@twenty.com>
66 lines
2.2 KiB
TypeScript
66 lines
2.2 KiB
TypeScript
/* eslint-disable @typescript-eslint/no-empty-function */
|
|
import { Injectable } from '@nestjs/common';
|
|
|
|
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/object-metadata.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 dataSourceMetadataService: DataSourceMetadataService,
|
|
private readonly objectMetadataService: ObjectMetadataService,
|
|
private readonly graphQLSchemaFactory: GraphQLSchemaFactory,
|
|
private readonly resolverFactory: ResolverFactory,
|
|
) {}
|
|
|
|
async createTenantSchema(workspaceId: string | undefined) {
|
|
if (!workspaceId) {
|
|
return new GraphQLSchema({});
|
|
}
|
|
|
|
const dataSourcesMetadata =
|
|
await this.dataSourceMetadataService.getDataSourcesMetadataFromWorkspaceId(
|
|
workspaceId,
|
|
);
|
|
|
|
// Can't find any data sources for this workspace
|
|
if (!dataSourcesMetadata || dataSourcesMetadata.length === 0) {
|
|
return new GraphQLSchema({});
|
|
}
|
|
|
|
const objectMetadataCollection =
|
|
await this.objectMetadataService.getObjectMetadataFromWorkspaceId(
|
|
workspaceId,
|
|
);
|
|
|
|
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;
|
|
}
|
|
}
|