Fix find tool filters by mapping many-to-one relations to fieldId (#15716)

**Root Cause**  
Many-to-one relation filters were being exposed under the relation name
(e.g., `company`) instead of the corresponding foreign-key attribute
(e.g., `companyId`).

**Change**  
- Detect many-to-one relation metadata and remap those filter keys to
`<fieldName>Id`.
- Removed some unused code unrelated to this fix.
This commit is contained in:
Abdul Rahman
2025-11-08 19:02:06 +05:30
committed by GitHub
parent 4c4eeef5ae
commit 06d8c8c76a
9 changed files with 18 additions and 29 deletions
@@ -20,7 +20,7 @@ import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.ent
import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator';
import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard';
export interface ChatRequest {
interface ChatRequest {
messages: ModelMessage[];
temperature?: number;
maxOutputTokens?: number;
@@ -1,10 +1,15 @@
import { type RestrictedFieldsPermissions } from 'twenty-shared/types';
import {
FieldMetadataType,
RelationType,
type RestrictedFieldsPermissions,
} from 'twenty-shared/types';
import { z } from 'zod';
import { generateFieldFilterZodSchema } from 'src/engine/core-modules/record-crud/zod-schemas/field-filters.zod-schema';
import { ObjectRecordOrderBySchema } from 'src/engine/core-modules/record-crud/zod-schemas/order-by.zod-schema';
import { shouldExcludeFieldFromAgentToolSchema } from 'src/engine/metadata-modules/field-metadata/utils/should-exclude-field-from-agent-tool-schema.util';
import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { isFieldMetadataEntityOfType } from 'src/engine/utils/is-field-metadata-of-type.util';
export const generateFindToolInputSchema = (
objectMetadata: ObjectMetadataEntity,
@@ -23,9 +28,16 @@ export const generateFindToolInputSchema = (
const filterSchema = generateFieldFilterZodSchema(field);
if (filterSchema) {
filterShape[field.name] = filterSchema;
if (!filterSchema) {
return;
}
const isManyToOneRelationField =
isFieldMetadataEntityOfType(field, FieldMetadataType.RELATION) &&
field.settings?.relationType === RelationType.MANY_TO_ONE;
filterShape[isManyToOneRelationField ? `${field.name}Id` : field.name] =
filterSchema;
});
return z.object({