import { Injectable } from '@nestjs/common'; import { type ObjectRecord } from 'twenty-shared/types'; import { WorkspaceAuthContext } from 'src/engine/api/common/interfaces/workspace-auth-context.interface'; import { CommonBaseQueryRunnerService } from 'src/engine/api/common/common-query-runners/common-base-query-runner.service'; import { CommonCreateManyQueryRunnerService } from 'src/engine/api/common/common-query-runners/common-create-many-query-runner/common-create-many-query-runner.service'; import { CommonBaseQueryRunnerContext } from 'src/engine/api/common/types/common-base-query-runner-context.type'; import { CommonExtendedQueryRunnerContext } from 'src/engine/api/common/types/common-extended-query-runner-context.type'; import { CommonExtendedInput, CommonInput, CommonQueryNames, CreateManyQueryArgs, CreateOneQueryArgs, } from 'src/engine/api/common/types/common-query-args.type'; 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'; import { ObjectMetadataMaps } from 'src/engine/metadata-modules/types/object-metadata-maps'; @Injectable() export class CommonCreateOneQueryRunnerService extends CommonBaseQueryRunnerService< CreateOneQueryArgs, ObjectRecord > { constructor( private readonly commonCreateManyQueryRunnerService: CommonCreateManyQueryRunnerService, ) { super(); } protected readonly operationName = CommonQueryNames.CREATE_ONE; async run( args: CommonExtendedInput, queryRunnerContext: CommonExtendedQueryRunnerContext, ): Promise { const result = await this.commonCreateManyQueryRunnerService.run( { ...args, data: [args.data], }, queryRunnerContext, ); return result[0]; } async computeArgs( args: CommonInput, queryRunnerContext: CommonBaseQueryRunnerContext, ): Promise> { const { authContext, objectMetadataItemWithFieldMaps } = queryRunnerContext; const coercedData = await this.dataArgProcessor.process({ partialRecordInputs: [args.data], authContext, objectMetadataItemWithFieldMaps, }); return { ...args, data: coercedData[0], }; } async processQueryResult( queryResult: ObjectRecord, objectMetadataItemId: string, objectMetadataMaps: ObjectMetadataMaps, authContext: WorkspaceAuthContext, ): Promise { return this.commonResultGettersService.processRecord( queryResult, objectMetadataItemId, objectMetadataMaps, authContext.workspace.id, ); } async validate( args: CommonInput, queryRunnerContext: CommonBaseQueryRunnerContext, ): Promise { const { objectMetadataItemWithFieldMaps } = queryRunnerContext; assertMutationNotOnRemoteObject(objectMetadataItemWithFieldMaps); if (args.data?.id) { assertIsValidUuid(args.data.id); } } }