import graphqlFields from 'graphql-fields'; import { In, InsertResult } from 'typeorm'; import { Record as IRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/record.interface'; import { WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; import { CreateManyResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; import { GraphqlQueryParser } from 'src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query.parser'; import { ObjectRecordsToGraphqlConnectionMapper } from 'src/engine/api/graphql/graphql-query-runner/orm-mappers/object-records-to-graphql-connection.mapper'; import { getObjectMetadataOrThrow } from 'src/engine/api/graphql/graphql-query-runner/utils/get-object-metadata-or-throw.util'; import { generateObjectMetadataMap } from 'src/engine/metadata-modules/utils/generate-object-metadata-map.util'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; export class GraphqlQueryCreateManyResolverService { private twentyORMGlobalManager: TwentyORMGlobalManager; constructor(twentyORMGlobalManager: TwentyORMGlobalManager) { this.twentyORMGlobalManager = twentyORMGlobalManager; } async createMany( args: CreateManyResolverArgs>, options: WorkspaceQueryRunnerOptions, ): Promise { const { authContext, objectMetadataItem, objectMetadataCollection, info } = options; const repository = await this.twentyORMGlobalManager.getRepositoryForWorkspace( authContext.workspace.id, objectMetadataItem.nameSingular, ); const objectMetadataMap = generateObjectMetadataMap( objectMetadataCollection, ); const objectMetadata = getObjectMetadataOrThrow( objectMetadataMap, objectMetadataItem.nameSingular, ); const graphqlQueryParser = new GraphqlQueryParser( objectMetadata.fields, objectMetadataMap, ); const selectedFields = graphqlFields(info); const { select, relations } = graphqlQueryParser.parseSelectedFields( objectMetadataItem, selectedFields, ); const objectRecords: InsertResult = !args.upsert ? await repository.insert(args.data) : await repository.upsert(args.data, { conflictPaths: ['id'], skipUpdateIfNoValuesChanged: true, }); const upsertedRecords = await repository.find({ where: { id: In(objectRecords.generatedMaps.map((record) => record.id)), }, select, relations, }); const typeORMObjectRecordsParser = new ObjectRecordsToGraphqlConnectionMapper(objectMetadataMap); return upsertedRecords.map((record: ObjectRecord) => typeORMObjectRecordsParser.processRecord( record, objectMetadataItem.nameSingular, 1, 1, ), ); } }