Files
twenty/packages/twenty-front/src/modules/workflow/hooks/useActiveWorkflowVersionsWithManualTrigger.ts
T
Charles Bochet 0fd6085b53 Prevent querying too much on worklow index page (#14916)
## Performance short term fix

Done in this PR:
workflowVersions and workflowRuns are heavy object. I'm preventing
loading their data when they are loaded as relations. This will reduce
the work on backend

## Long term fix

Todo:
We should make sure workflow data is ligher
2025-10-06 23:53:58 +02:00

89 lines
2.3 KiB
TypeScript

import { isGlobalManualTrigger } from '@/action-menu/actions/record-actions/utils/isGlobalManualTrigger';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
import {
type ManualTriggerWorkflowVersion,
type Workflow,
} from '@/workflow/types/Workflow';
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { isDefined } from 'twenty-shared/utils';
import { FeatureFlagKey } from '~/generated/graphql';
export const useActiveWorkflowVersionsWithManualTrigger = ({
objectMetadataItem,
skip,
}: {
objectMetadataItem?: ObjectMetadataItem;
skip?: boolean;
}) => {
const isIteratorEnabled = useIsFeatureEnabled(
FeatureFlagKey.IS_WORKFLOW_ITERATOR_ENABLED,
);
const filters = [
{
status: {
eq: 'ACTIVE',
},
},
{
trigger: {
like: `%"type": "MANUAL"%`,
},
},
];
const objectTypeFilter = isIteratorEnabled
? {
trigger: {
like: `%"objectNameSingular": "${objectMetadataItem?.nameSingular}"%`,
},
}
: {
trigger: {
like: `%"objectType": "${objectMetadataItem?.nameSingular}"%`,
},
};
if (isDefined(objectMetadataItem)) {
filters.push(objectTypeFilter);
}
const { records } = useFindManyRecords<
Pick<
ManualTriggerWorkflowVersion,
'id' | '__typename' | 'status' | 'workflowId' | 'trigger'
> & {
workflow: Workflow;
}
>({
objectNameSingular: CoreObjectNameSingular.WorkflowVersion,
filter: {
and: filters,
},
recordGqlFields: {
id: true,
trigger: true,
workflowId: true,
workflow: true,
status: true,
},
skip,
});
// TODO: refactor when we can use 'not like' in the RawJson filter
if (!isDefined(objectMetadataItem)) {
return {
records: records.filter(
(record) =>
record.status === 'ACTIVE' &&
isDefined(record.trigger) &&
isGlobalManualTrigger(record.trigger, isIteratorEnabled),
),
};
}
return { records: records.filter((record) => isDefined(record.workflow)) };
};