diff --git a/packages/twenty-front/src/modules/object-record/spreadsheet-import/utils/__tests__/buildRecordFromImportedStructuredRow.test.ts b/packages/twenty-front/src/modules/object-record/spreadsheet-import/utils/__tests__/buildRecordFromImportedStructuredRow.test.ts index 8307a0eca2..ee142c6d97 100644 --- a/packages/twenty-front/src/modules/object-record/spreadsheet-import/utils/__tests__/buildRecordFromImportedStructuredRow.test.ts +++ b/packages/twenty-front/src/modules/object-record/spreadsheet-import/utils/__tests__/buildRecordFromImportedStructuredRow.test.ts @@ -519,6 +519,94 @@ describe('buildRecordFromImportedStructuredRow', () => { }); }); + it('should lowercase relation email composite subfield', () => { + const importedStructuredRow: ImportedStructuredRow = { + 'emailField (relationField)': 'John.Doe@Example.COM', + }; + + const spreadsheetImportFields = [ + { + fieldMetadataItemId: '6', + isNestedField: false, + isRelationConnectField: true, + label: 'Relation Field / Email Field', + key: 'emailField (relationField)', + fieldMetadataType: FieldMetadataType.RELATION, + uniqueFieldMetadataItem: { + name: 'emailField', + type: FieldMetadataType.EMAILS, + }, + compositeSubFieldKey: 'primaryEmail', + }, + ] as SpreadsheetImportField[]; + + const result = buildRecordFromImportedStructuredRow({ + importedStructuredRow, + fieldMetadataItems: fields, + spreadsheetImportFields, + }); + + expect(result).toEqual({ + relationField: { + connect: { + where: { + emailField: { + primaryEmail: 'john.doe@example.com', + }, + }, + }, + }, + createdBy: { + source: 'IMPORT', + context: {}, + }, + }); + }); + + it('should normalize relation links composite subfield', () => { + const importedStructuredRow: ImportedStructuredRow = { + 'domainNameField (relationField)': 'HTTPS://Example.COM/path/', + }; + + const spreadsheetImportFields = [ + { + fieldMetadataItemId: '6', + isNestedField: false, + isRelationConnectField: true, + label: 'Relation Field / Domain Name Field', + key: 'domainNameField (relationField)', + fieldMetadataType: FieldMetadataType.RELATION, + uniqueFieldMetadataItem: { + name: 'linksField', + type: FieldMetadataType.LINKS, + }, + compositeSubFieldKey: 'primaryLinkUrl', + }, + ] as SpreadsheetImportField[]; + + const result = buildRecordFromImportedStructuredRow({ + importedStructuredRow, + fieldMetadataItems: fields, + spreadsheetImportFields, + }); + + expect(result).toEqual({ + relationField: { + connect: { + where: { + linksField: { + primaryLinkUrl: 'https://example.com/path', + }, + }, + }, + }, + createdBy: { + source: 'IMPORT', + context: {}, + }, + }); + }); + it('should return empty record for empty imported row', () => { const importedStructuredRow: ImportedStructuredRow = {}; diff --git a/packages/twenty-front/src/modules/object-record/spreadsheet-import/utils/buildRecordFromImportedStructuredRow.ts b/packages/twenty-front/src/modules/object-record/spreadsheet-import/utils/buildRecordFromImportedStructuredRow.ts index 97f730dd35..ca1d30ff87 100644 --- a/packages/twenty-front/src/modules/object-record/spreadsheet-import/utils/buildRecordFromImportedStructuredRow.ts +++ b/packages/twenty-front/src/modules/object-record/spreadsheet-import/utils/buildRecordFromImportedStructuredRow.ts @@ -202,7 +202,7 @@ export const buildRecordFromImportedStructuredRow = ({ }, [FieldMetadataType.EMAILS]: { - primaryEmail: castToString, + primaryEmail: (value: unknown) => castToString(value).toLowerCase(), additionalEmails: stringArrayJSONSchema.parse, }, [FieldMetadataType.FULL_NAME]: { diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/data-arg-processor.service.spec.ts b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/data-arg-processor.service.spec.ts index fa40a1c7fc..6606924ae8 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/data-arg-processor.service.spec.ts +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/data-arg-processor.service.spec.ts @@ -1,6 +1,6 @@ import { Test, type TestingModule } from '@nestjs/testing'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationType } from 'twenty-shared/types'; import { DataArgProcessorService } from 'src/engine/api/common/common-args-processors/data-arg-processor/data-arg-processor.service'; import { type SystemWorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type'; @@ -116,6 +116,118 @@ describe('DataArgProcessorService', () => { expect(dataArgProcessorService).toBeDefined(); }); + it('should normalize relation connect where composite values', async () => { + const flatFieldMetadataMaps: FlatEntityMaps = { + byUniversalIdentifier: { + 'company-universal-id': { + id: 'company-id', + name: 'company', + type: FieldMetadataType.RELATION, + isNullable: true, + objectMetadataId: 'object-id', + universalIdentifier: 'company-universal-id', + relationTargetObjectMetadataId: 'target-company-object-id', + settings: { + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'companyId', + }, + } as FlatFieldMetadata, + 'emails-universal-id': { + id: 'emails-id', + name: 'emails', + type: FieldMetadataType.EMAILS, + isNullable: true, + objectMetadataId: 'target-company-object-id', + universalIdentifier: 'emails-universal-id', + } as FlatFieldMetadata, + 'domainName-universal-id': { + id: 'domainName-id', + name: 'domainName', + type: FieldMetadataType.LINKS, + isNullable: true, + objectMetadataId: 'target-company-object-id', + universalIdentifier: 'domainName-universal-id', + } as FlatFieldMetadata, + }, + universalIdentifierById: { + 'company-id': 'company-universal-id', + 'emails-id': 'emails-universal-id', + 'domainName-id': 'domainName-universal-id', + }, + universalIdentifiersByApplicationId: {}, + }; + + const flatObjectMetadata = { + id: 'object-id', + nameSingular: 'testObject', + namePlural: 'testObjects', + isCustom: false, + fieldIds: ['company-id'], + universalIdentifier: 'test-object-universal-id', + labelIdentifierFieldMetadataUniversalIdentifier: null, + imageIdentifierFieldMetadataUniversalIdentifier: null, + } as FlatObjectMetadata; + + const flatObjectMetadataMaps = { + byUniversalIdentifier: { + 'target-company-universal-id': { + id: 'target-company-object-id', + nameSingular: 'company', + namePlural: 'companies', + isCustom: false, + fieldIds: ['emails-id', 'domainName-id'], + universalIdentifier: 'target-company-universal-id', + labelIdentifierFieldMetadataUniversalIdentifier: null, + imageIdentifierFieldMetadataUniversalIdentifier: null, + } as FlatObjectMetadata, + }, + universalIdentifierById: { + 'target-company-object-id': 'target-company-universal-id', + }, + universalIdentifiersByApplicationId: {}, + }; + + const result = await dataArgProcessorService.process({ + partialRecordInputs: [ + { + company: { + connect: { + where: { + emails: { + primaryEmail: 'User@Example.COM', + }, + domainName: { + primaryLinkUrl: 'HTTPS://Example.COM/path/', + }, + }, + }, + }, + }, + ], + authContext: createMockAuthContext(), + flatObjectMetadata, + flatFieldMetadataMaps, + flatObjectMetadataMaps, + }); + + expect(result).toEqual([ + { + company: { + connect: { + where: { + emails: { + primaryEmail: 'user@example.com', + }, + domainName: { + primaryLinkUrl: 'https://example.com/path', + }, + }, + }, + }, + }, + ]); + }); + describe('failing inputs validation', () => { const fieldMetadataTypesToTest = Object.keys( failingInputsByFieldMetadataType, @@ -146,6 +258,11 @@ describe('DataArgProcessorService', () => { authContext: createMockAuthContext(), flatObjectMetadata, flatFieldMetadataMaps, + flatObjectMetadataMaps: { + byUniversalIdentifier: {}, + universalIdentifierById: {}, + universalIdentifiersByApplicationId: {}, + }, }), ).rejects.toThrowErrorMatchingSnapshot(); }); @@ -183,6 +300,11 @@ describe('DataArgProcessorService', () => { authContext: createMockAuthContext(), flatObjectMetadata, flatFieldMetadataMaps, + flatObjectMetadataMaps: { + byUniversalIdentifier: {}, + universalIdentifierById: {}, + universalIdentifiersByApplicationId: {}, + }, }); expect(result).toBeDefined(); diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/data-arg-processor.service.ts b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/data-arg-processor.service.ts index 2eba50904c..43a3ac9cd7 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/data-arg-processor.service.ts +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/data-arg-processor.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; import { msg } from '@lingui/core/macro'; -import { isNull, isUndefined } from '@sniptt/guards'; +import { isNull, isObject, isUndefined } from '@sniptt/guards'; import { FieldMetadataSettingsMapping, FieldMetadataType, @@ -15,7 +15,6 @@ import { } from 'twenty-shared/utils'; import { transformActorField } from 'src/engine/api/common/common-args-processors/data-arg-processor/transformer-utils/transform-actor-field.util'; -import { isRelationNestedOperation } from 'src/engine/api/common/common-args-processors/data-arg-processor/utils/is-relation-nested-operation.util'; import { transformAddressField } from 'src/engine/api/common/common-args-processors/data-arg-processor/transformer-utils/transform-address-field.util'; import { transformArrayField } from 'src/engine/api/common/common-args-processors/data-arg-processor/transformer-utils/transform-array-field.util'; import { transformCurrencyField } from 'src/engine/api/common/common-args-processors/data-arg-processor/transformer-utils/transform-currency-field.util'; @@ -23,6 +22,7 @@ import { transformFullNameField } from 'src/engine/api/common/common-args-proces import { transformNumericField } from 'src/engine/api/common/common-args-processors/data-arg-processor/transformer-utils/transform-numeric-field.util'; import { transformRawJsonField } from 'src/engine/api/common/common-args-processors/data-arg-processor/transformer-utils/transform-raw-json-field.util'; import { transformTextField } from 'src/engine/api/common/common-args-processors/data-arg-processor/transformer-utils/transform-text-field.util'; +import { isRelationNestedOperation } from 'src/engine/api/common/common-args-processors/data-arg-processor/utils/is-relation-nested-operation.util'; import { validateActorFieldOrThrow } from 'src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-actor-field-or-throw.util'; import { validateAddressFieldOrThrow } from 'src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-address-field-or-throw.util'; import { validateArrayFieldOrThrow } from 'src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-array-field-or-throw.util'; @@ -56,12 +56,12 @@ import { transformLinksValue } from 'src/engine/core-modules/record-transformer/ import { transformPhonesValue } from 'src/engine/core-modules/record-transformer/utils/transform-phones-value.util'; import { transformRichTextValue } from 'src/engine/core-modules/record-transformer/utils/transform-rich-text.util'; import { WorkspaceNotFoundDefaultError } from 'src/engine/core-modules/workspace/workspace.exception'; +import { computeMorphOrRelationFieldJoinColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-morph-or-relation-field-join-column-name.util'; import { FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { computeMorphOrRelationFieldJoinColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-morph-or-relation-field-join-column-name.util'; import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; import { buildFieldMapsFromFlatObjectMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/build-field-maps-from-flat-object-metadata.util'; +import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; @Injectable() @@ -73,12 +73,14 @@ export class DataArgProcessorService { authContext, flatObjectMetadata, flatFieldMetadataMaps, + flatObjectMetadataMaps, shouldBackfillPositionIfUndefined = true, }: { partialRecordInputs: Partial[] | undefined; authContext: WorkspaceAuthContext; flatObjectMetadata: FlatObjectMetadata; flatFieldMetadataMaps: FlatEntityMaps; + flatObjectMetadataMaps: FlatEntityMaps; shouldBackfillPositionIfUndefined?: boolean; }): Promise[]> { if (!isDefined(partialRecordInputs)) { @@ -158,6 +160,8 @@ export class DataArgProcessorService { fieldMetadata, key, value, + flatFieldMetadataMaps, + flatObjectMetadataMaps, ); } processedRecords.push(processedRecord); @@ -170,6 +174,8 @@ export class DataArgProcessorService { fieldMetadata: FlatFieldMetadata, key: string, value: unknown, + flatFieldMetadataMaps: FlatEntityMaps, + flatObjectMetadataMaps: FlatEntityMaps, ): Promise { switch (fieldMetadata.type) { case FieldMetadataType.POSITION: @@ -260,6 +266,29 @@ export class DataArgProcessorService { ); } + const connectOperation = value as Record< + string, + Record + >; + const connectWhere = connectOperation.connect?.where; + + if (isObject(connectWhere)) { + const processedWhere = await this.processConnectWhere( + connectWhere as Record, + fieldMetadata, + flatFieldMetadataMaps, + flatObjectMetadataMaps, + ); + + return { + ...connectOperation, + connect: { + ...connectOperation.connect, + where: processedWhere, + }, + }; + } + return value; } case FieldMetadataType.PHONES: { @@ -325,4 +354,85 @@ export class DataArgProcessorService { ); } } + + private async processConnectWhere( + connectWhere: Record, + relationFieldMetadata: FlatFieldMetadata, + flatFieldMetadataMaps: FlatEntityMaps, + flatObjectMetadataMaps: FlatEntityMaps, + ): Promise> { + if (!isDefined(relationFieldMetadata.relationTargetObjectMetadataId)) { + throw new CommonQueryRunnerException( + `Relation target object metadata id not found for field ${relationFieldMetadata.name}`, + CommonQueryRunnerExceptionCode.INVALID_ARGS_DATA, + { userFriendlyMessage: STANDARD_ERROR_MESSAGE }, + ); + } + + const targetObjectMetadata = + findFlatEntityByIdInFlatEntityMaps({ + flatEntityId: relationFieldMetadata.relationTargetObjectMetadataId, + flatEntityMaps: flatObjectMetadataMaps, + }); + + if (!isDefined(targetObjectMetadata)) { + throw new CommonQueryRunnerException( + `Relation target object metadata not found for field ${relationFieldMetadata.name}`, + CommonQueryRunnerExceptionCode.INVALID_ARGS_DATA, + { userFriendlyMessage: STANDARD_ERROR_MESSAGE }, + ); + } + + const { fieldIdByName } = buildFieldMapsFromFlatObjectMetadata( + flatFieldMetadataMaps, + targetObjectMetadata, + ); + + const processedWhere: Record = {}; + + for (const [whereKey, whereValue] of Object.entries(connectWhere)) { + const fieldId = fieldIdByName[whereKey]; + + if (!isDefined(fieldId)) { + processedWhere[whereKey] = whereValue; + continue; + } + + const whereFieldMetadata = + findFlatEntityByIdInFlatEntityMaps({ + flatEntityId: fieldId, + flatEntityMaps: flatFieldMetadataMaps, + }); + + if (!isDefined(whereFieldMetadata)) { + processedWhere[whereKey] = whereValue; + continue; + } + + try { + const processedValue = await this.processField( + whereFieldMetadata, + whereKey, + whereValue, + flatFieldMetadataMaps, + flatObjectMetadataMaps, + ); + + // Only keep original keys — processField may add null subfields that alter WHERE semantics + if (isObject(whereValue) && isObject(processedValue)) { + const originalKeys = new Set(Object.keys(whereValue)); + + processedWhere[whereKey] = Object.fromEntries( + Object.entries(processedValue).filter(([k]) => originalKeys.has(k)), + ); + } else { + processedWhere[whereKey] = processedValue; + } + } catch { + processedWhere[whereKey] = whereValue; + } + } + + return processedWhere; + } } diff --git a/packages/twenty-server/src/engine/api/common/common-query-runners/common-create-many-query-runner/common-create-many-query-runner.service.ts b/packages/twenty-server/src/engine/api/common/common-query-runners/common-create-many-query-runner/common-create-many-query-runner.service.ts index 639543aa37..5a3fb2ede5 100644 --- a/packages/twenty-server/src/engine/api/common/common-query-runners/common-create-many-query-runner/common-create-many-query-runner.service.ts +++ b/packages/twenty-server/src/engine/api/common/common-query-runners/common-create-many-query-runner/common-create-many-query-runner.service.ts @@ -145,8 +145,12 @@ export class CommonCreateManyQueryRunnerService extends CommonBaseQueryRunnerSer args: CommonInput, queryRunnerContext: CommonBaseQueryRunnerContext, ): Promise> { - const { authContext, flatObjectMetadata, flatFieldMetadataMaps } = - queryRunnerContext; + const { + authContext, + flatObjectMetadata, + flatFieldMetadataMaps, + flatObjectMetadataMaps, + } = queryRunnerContext; return { ...args, @@ -155,6 +159,7 @@ export class CommonCreateManyQueryRunnerService extends CommonBaseQueryRunnerSer authContext, flatObjectMetadata, flatFieldMetadataMaps, + flatObjectMetadataMaps, }), }; } diff --git a/packages/twenty-server/src/engine/api/common/common-query-runners/common-create-one-query-runner.service.ts b/packages/twenty-server/src/engine/api/common/common-query-runners/common-create-one-query-runner.service.ts index ae4eb48342..b8bac82b00 100644 --- a/packages/twenty-server/src/engine/api/common/common-query-runners/common-create-one-query-runner.service.ts +++ b/packages/twenty-server/src/engine/api/common/common-query-runners/common-create-one-query-runner.service.ts @@ -2,7 +2,6 @@ import { Injectable } from '@nestjs/common'; import { type ObjectRecord } from 'twenty-shared/types'; -import { WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type'; 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'; @@ -15,6 +14,7 @@ import { 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 { WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type'; import { FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; @@ -52,14 +52,19 @@ export class CommonCreateOneQueryRunnerService extends CommonBaseQueryRunnerServ args: CommonInput, queryRunnerContext: CommonBaseQueryRunnerContext, ): Promise> { - const { authContext, flatObjectMetadata, flatFieldMetadataMaps } = - queryRunnerContext; + const { + authContext, + flatObjectMetadata, + flatFieldMetadataMaps, + flatObjectMetadataMaps, + } = queryRunnerContext; const coercedData = await this.dataArgProcessor.process({ partialRecordInputs: [args.data], authContext, flatObjectMetadata, flatFieldMetadataMaps, + flatObjectMetadataMaps, }); return { diff --git a/packages/twenty-server/src/engine/api/common/common-query-runners/common-find-duplicates-query-runner.service.ts b/packages/twenty-server/src/engine/api/common/common-query-runners/common-find-duplicates-query-runner.service.ts index 75aac10ada..887539bb13 100644 --- a/packages/twenty-server/src/engine/api/common/common-query-runners/common-find-duplicates-query-runner.service.ts +++ b/packages/twenty-server/src/engine/api/common/common-query-runners/common-find-duplicates-query-runner.service.ts @@ -176,8 +176,12 @@ export class CommonFindDuplicatesQueryRunnerService extends CommonBaseQueryRunne args: CommonInput, queryRunnerContext: CommonBaseQueryRunnerContext, ): Promise> { - const { authContext, flatObjectMetadata, flatFieldMetadataMaps } = - queryRunnerContext; + const { + authContext, + flatObjectMetadata, + flatFieldMetadataMaps, + flatObjectMetadataMaps, + } = queryRunnerContext; const { fieldIdByName } = buildFieldMapsFromFlatObjectMetadata( flatFieldMetadataMaps, @@ -202,6 +206,7 @@ export class CommonFindDuplicatesQueryRunnerService extends CommonBaseQueryRunne authContext, flatObjectMetadata, flatFieldMetadataMaps, + flatObjectMetadataMaps, shouldBackfillPositionIfUndefined: false, }), }; diff --git a/packages/twenty-server/src/engine/api/common/common-query-runners/common-update-many-query-runner.service.ts b/packages/twenty-server/src/engine/api/common/common-query-runners/common-update-many-query-runner.service.ts index d776671751..3f5692da0d 100644 --- a/packages/twenty-server/src/engine/api/common/common-query-runners/common-update-many-query-runner.service.ts +++ b/packages/twenty-server/src/engine/api/common/common-query-runners/common-update-many-query-runner.service.ts @@ -100,8 +100,12 @@ export class CommonUpdateManyQueryRunnerService extends CommonBaseQueryRunnerSer args: CommonInput, queryRunnerContext: CommonBaseQueryRunnerContext, ): Promise> { - const { authContext, flatObjectMetadata, flatFieldMetadataMaps } = - queryRunnerContext; + const { + authContext, + flatObjectMetadata, + flatFieldMetadataMaps, + flatObjectMetadataMaps, + } = queryRunnerContext; return { ...args, @@ -116,6 +120,7 @@ export class CommonUpdateManyQueryRunnerService extends CommonBaseQueryRunnerSer authContext, flatObjectMetadata, flatFieldMetadataMaps, + flatObjectMetadataMaps, shouldBackfillPositionIfUndefined: false, }) )[0], diff --git a/packages/twenty-server/src/engine/api/common/common-query-runners/common-update-one-query-runner.service.ts b/packages/twenty-server/src/engine/api/common/common-query-runners/common-update-one-query-runner.service.ts index 78d19e57f6..4ca6c814a1 100644 --- a/packages/twenty-server/src/engine/api/common/common-query-runners/common-update-one-query-runner.service.ts +++ b/packages/twenty-server/src/engine/api/common/common-query-runners/common-update-one-query-runner.service.ts @@ -65,8 +65,12 @@ export class CommonUpdateOneQueryRunnerService extends CommonBaseQueryRunnerServ args: CommonInput, queryRunnerContext: CommonBaseQueryRunnerContext, ): Promise> { - const { authContext, flatObjectMetadata, flatFieldMetadataMaps } = - queryRunnerContext; + const { + authContext, + flatObjectMetadata, + flatFieldMetadataMaps, + flatObjectMetadataMaps, + } = queryRunnerContext; return { ...args, @@ -76,6 +80,7 @@ export class CommonUpdateOneQueryRunnerService extends CommonBaseQueryRunnerServ authContext, flatObjectMetadata, flatFieldMetadataMaps, + flatObjectMetadataMaps, shouldBackfillPositionIfUndefined: false, }) )[0],