From 04d4c07b695eb8d40ac665b98d4d64428b601bc9 Mon Sep 17 00:00:00 2001 From: Etienne <45695613+etiennejouan@users.noreply.github.com> Date: Tue, 2 Sep 2025 11:40:43 +0200 Subject: [PATCH] fix - use createMany service in createOne one (#14208) closes : https://github.com/twentyhq/twenty/issues/14072 --- ...aphql-query-create-one-resolver.service.ts | 94 +++---------------- 1 file changed, 15 insertions(+), 79 deletions(-) diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-create-one-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-create-one-resolver.service.ts index debd53b1a0..396c904efd 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-create-one-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-create-one-resolver.service.ts @@ -1,19 +1,14 @@ import { Injectable } from '@nestjs/common'; -import { QUERY_MAX_RECORDS } from 'twenty-shared/constants'; -import { In, type InsertResult } from 'typeorm'; - import { GraphqlQueryBaseResolverService, type GraphqlQueryResolverExecutionArgs, } from 'src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service'; import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; -import { type WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; +import { WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; import { type CreateOneResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; -import { ObjectRecordsToGraphqlConnectionHelper } from 'src/engine/api/graphql/graphql-query-runner/helpers/object-records-to-graphql-connection.helper'; -import { buildColumnsToReturn } from 'src/engine/api/graphql/graphql-query-runner/utils/build-columns-to-return'; -import { buildColumnsToSelect } from 'src/engine/api/graphql/graphql-query-runner/utils/build-columns-to-select'; +import { GraphqlQueryCreateManyResolverService } from 'src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-create-many-resolver.service'; import { assertIsValidUuid } from 'src/engine/api/graphql/workspace-query-runner/utils/assert-is-valid-uuid.util'; import { assertMutationNotOnRemoteObject } from 'src/engine/metadata-modules/object-metadata/utils/assert-mutation-not-on-remote-object.util'; @@ -22,83 +17,24 @@ export class GraphqlQueryCreateOneResolverService extends GraphqlQueryBaseResolv CreateOneResolverArgs, ObjectRecord > { + constructor( + private readonly createManyResolverService: GraphqlQueryCreateManyResolverService, + ) { + super(); + } + async resolve( executionArgs: GraphqlQueryResolverExecutionArgs, ): Promise { - const { authContext, objectMetadataMaps, objectMetadataItemWithFieldMaps } = - executionArgs.options; - - const { roleId } = executionArgs; - - const selectedColumns = buildColumnsToReturn({ - select: executionArgs.graphqlQuerySelectedFieldsResult.select, - relations: executionArgs.graphqlQuerySelectedFieldsResult.relations, - objectMetadataItemWithFieldMaps, - objectMetadataMaps, + const result = await this.createManyResolverService.resolve({ + ...executionArgs, + args: { + ...executionArgs.args, + data: [executionArgs.args.data], + }, }); - const objectRecords: InsertResult = !executionArgs.args.upsert - ? await executionArgs.repository.insert( - executionArgs.args.data, - undefined, - selectedColumns, - ) - : await executionArgs.repository.upsert( - executionArgs.args.data, - { - conflictPaths: ['id'], - skipUpdateIfNoValuesChanged: true, - }, - undefined, - selectedColumns, - ); - - const queryBuilder = executionArgs.repository.createQueryBuilder( - objectMetadataItemWithFieldMaps.nameSingular, - ); - - const columnsToSelect = buildColumnsToSelect({ - select: executionArgs.graphqlQuerySelectedFieldsResult.select, - relations: executionArgs.graphqlQuerySelectedFieldsResult.relations, - objectMetadataItemWithFieldMaps, - objectMetadataMaps, - }); - - const upsertedRecords = (await queryBuilder - .setFindOptions({ - select: columnsToSelect, - }) - .where({ - id: In(objectRecords.generatedMaps.map((record) => record.id)), - }) - .take(QUERY_MAX_RECORDS) - .getMany()) as ObjectRecord[]; - - if (executionArgs.graphqlQuerySelectedFieldsResult.relations) { - await this.processNestedRelationsHelper.processNestedRelations({ - objectMetadataMaps, - parentObjectMetadataItem: objectMetadataItemWithFieldMaps, - parentObjectRecords: upsertedRecords, - relations: executionArgs.graphqlQuerySelectedFieldsResult.relations, - limit: QUERY_MAX_RECORDS, - authContext, - workspaceDataSource: executionArgs.workspaceDataSource, - roleId, - shouldBypassPermissionChecks: - executionArgs.shouldBypassPermissionChecks, - selectedFields: executionArgs.graphqlQuerySelectedFieldsResult.select, - }); - } - - const typeORMObjectRecordsParser = - new ObjectRecordsToGraphqlConnectionHelper(objectMetadataMaps); - - return typeORMObjectRecordsParser.processRecord({ - objectRecord: upsertedRecords[0], - objectName: objectMetadataItemWithFieldMaps.nameSingular, - take: 1, - totalCount: 1, - }); + return result[0]; } async validate(