diff --git a/packages/twenty-server/src/engine/core-modules/record-crud/types/record-crud-input.type.ts b/packages/twenty-server/src/engine/core-modules/record-crud/types/record-crud-input.type.ts index 91ba7af519..496ec7a3e4 100644 --- a/packages/twenty-server/src/engine/core-modules/record-crud/types/record-crud-input.type.ts +++ b/packages/twenty-server/src/engine/core-modules/record-crud/types/record-crud-input.type.ts @@ -1,7 +1,4 @@ -import { - type ObjectRecordFilter, - type ObjectRecordOrderBy, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecordOrderBy } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type ObjectRecordProperties } from './object-record-properties.type'; @@ -30,7 +27,6 @@ export type FindRecordsInput = { recordFilterGroups?: any; // oxlint-disable-next-line typescript/no-explicit-any recordFilters?: any; - gqlOperationFilter?: Partial[]; }; orderBy?: { // oxlint-disable-next-line typescript/no-explicit-any diff --git a/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/record-crud/find-records.workflow-action.ts b/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/record-crud/find-records.workflow-action.ts index 04bf853525..5c7580b665 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/record-crud/find-records.workflow-action.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/record-crud/find-records.workflow-action.ts @@ -3,6 +3,8 @@ import { Injectable } from '@nestjs/common'; import { computeRecordGqlOperationFilter, isDefined, + isEmptyObject, + isNonEmptyArray, isRecordFilterValueValid, resolveInput, } from 'twenty-shared/utils'; @@ -75,20 +77,28 @@ export class FindRecordsWorkflowAction implements WorkflowAction { } } - const gqlOperationFilter = - workflowActionInput.filter?.recordFilters && - workflowActionInput.filter?.recordFilterGroups - ? computeRecordGqlOperationFilter({ - fieldMetadataItems: Object.values( - flatFieldMetadataMaps.byUniversalIdentifier, - ).filter(isDefined), - recordFilters: workflowActionInput.filter.recordFilters, - recordFilterGroups: workflowActionInput.filter.recordFilterGroups, - filterValueDependencies: { - timeZone: 'UTC', - }, - }) - : {}; + const recordFilters = workflowActionInput.filter?.recordFilters; + + const gqlOperationFilter = isDefined(recordFilters) + ? computeRecordGqlOperationFilter({ + fieldMetadataItems: Object.values( + flatFieldMetadataMaps.byUniversalIdentifier, + ).filter(isDefined), + recordFilters, + recordFilterGroups: + workflowActionInput.filter?.recordFilterGroups ?? [], + filterValueDependencies: { + timeZone: 'UTC', + }, + }) + : {}; + + if (isNonEmptyArray(recordFilters) && isEmptyObject(gqlOperationFilter)) { + throw new WorkflowStepExecutorException( + 'Filter could not be resolved to a valid query. Check that filtered fields exist and that grouped filters include their recordFilterGroups.', + WorkflowStepExecutorExceptionCode.INVALID_STEP_INPUT, + ); + } const toolOutput = await this.findRecordsService.execute({ objectName: workflowActionInput.objectName, diff --git a/packages/twenty-shared/src/workflow/schemas/find-records-action-settings-schema.ts b/packages/twenty-shared/src/workflow/schemas/find-records-action-settings-schema.ts index 0dd390e5bb..1145daccf4 100644 --- a/packages/twenty-shared/src/workflow/schemas/find-records-action-settings-schema.ts +++ b/packages/twenty-shared/src/workflow/schemas/find-records-action-settings-schema.ts @@ -11,7 +11,6 @@ export const workflowFindRecordsActionSettingsSchema = .object({ recordFilterGroups: z.array(z.any()).optional(), recordFilters: z.array(z.any()).optional(), - gqlOperationFilter: z.any().optional().nullable(), }) .optional(), orderBy: z