Only fetch steps and trigger for the current workflow version (#15003)
Avoid fetching full steps and trigger for versions that are not the current version. Because those won't be used anyway. Better for performances. Only difficulty was for the `createDraft` mutation. I needed to return the full created version so I can store it in cache and use it as new `currentVersion`. Otherwise the current version is considered as incomplete for a short time, since workflow is fetched separately from the current version. --------- Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
+6
@@ -6,6 +6,12 @@ export const CREATE_DRAFT_FROM_WORKFLOW_VERSION = gql`
|
||||
) {
|
||||
createDraftFromWorkflowVersion(input: $input) {
|
||||
id
|
||||
name
|
||||
status
|
||||
trigger
|
||||
steps
|
||||
createdAt
|
||||
updatedAt
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
@@ -3,8 +3,11 @@ import { useMutation } from '@apollo/client';
|
||||
import { triggerUpdateRecordOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerUpdateRecordOptimisticEffect';
|
||||
import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient';
|
||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
|
||||
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
||||
import { modifyRecordFromCache } from '@/object-record/cache/utils/modifyRecordFromCache';
|
||||
import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions';
|
||||
import { useUpsertRecordsInStore } from '@/object-record/record-store/hooks/useUpsertRecordsInStore';
|
||||
import { ACTIVATE_WORKFLOW_VERSION } from '@/workflow/graphql/mutations/activateWorkflowVersion';
|
||||
import { type WorkflowVersion } from '@/workflow/types/Workflow';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
@@ -21,11 +24,15 @@ export const useActivateWorkflowVersion = () => {
|
||||
>(ACTIVATE_WORKFLOW_VERSION, {
|
||||
client: apolloCoreClient,
|
||||
});
|
||||
const { upsertRecordsInStore } = useUpsertRecordsInStore();
|
||||
|
||||
const { objectMetadataItem: objectMetadataItemWorkflowVersion } =
|
||||
useObjectMetadataItem({
|
||||
objectNameSingular: CoreObjectNameSingular.WorkflowVersion,
|
||||
});
|
||||
const { objectMetadataItems } = useObjectMetadataItems();
|
||||
|
||||
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
|
||||
|
||||
const activateWorkflowVersion = async ({
|
||||
workflowVersionId,
|
||||
@@ -75,7 +82,9 @@ export const useActivateWorkflowVersion = () => {
|
||||
...newlyActiveWorkflowVersion,
|
||||
status: 'ACTIVE',
|
||||
},
|
||||
objectMetadataItems: [objectMetadataItemWorkflowVersion],
|
||||
objectMetadataItems: objectMetadataItems,
|
||||
objectPermissionsByObjectMetadataId,
|
||||
upsertRecordsInStore,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -100,7 +109,9 @@ export const useActivateWorkflowVersion = () => {
|
||||
...workflowVersion,
|
||||
status: 'ARCHIVED',
|
||||
},
|
||||
objectMetadataItems: [objectMetadataItemWorkflowVersion],
|
||||
objectMetadataItems,
|
||||
objectPermissionsByObjectMetadataId,
|
||||
upsertRecordsInStore,
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
@@ -5,6 +5,8 @@ import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient
|
||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
||||
import { modifyRecordFromCache } from '@/object-record/cache/utils/modifyRecordFromCache';
|
||||
import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions';
|
||||
import { useUpsertRecordsInStore } from '@/object-record/record-store/hooks/useUpsertRecordsInStore';
|
||||
import { DEACTIVATE_WORKFLOW_VERSION } from '@/workflow/graphql/mutations/deactivateWorkflowVersion';
|
||||
import { type WorkflowVersion } from '@/workflow/types/Workflow';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
@@ -12,9 +14,12 @@ import {
|
||||
type DeactivateWorkflowVersionMutation,
|
||||
type DeactivateWorkflowVersionMutationVariables,
|
||||
} from '~/generated-metadata/graphql';
|
||||
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
|
||||
|
||||
export const useDeactivateWorkflowVersion = () => {
|
||||
const apolloCoreClient = useApolloCoreClient();
|
||||
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
|
||||
const { objectMetadataItems } = useObjectMetadataItems();
|
||||
const [mutate] = useMutation<
|
||||
DeactivateWorkflowVersionMutation,
|
||||
DeactivateWorkflowVersionMutationVariables
|
||||
@@ -22,6 +27,8 @@ export const useDeactivateWorkflowVersion = () => {
|
||||
client: apolloCoreClient,
|
||||
});
|
||||
|
||||
const { upsertRecordsInStore } = useUpsertRecordsInStore();
|
||||
|
||||
const { objectMetadataItem: objectMetadataItemWorkflowVersion } =
|
||||
useObjectMetadataItem({
|
||||
objectNameSingular: CoreObjectNameSingular.WorkflowVersion,
|
||||
@@ -67,7 +74,9 @@ export const useDeactivateWorkflowVersion = () => {
|
||||
...workflowVersion,
|
||||
status: 'DEACTIVATED',
|
||||
},
|
||||
objectMetadataItems: [objectMetadataItemWorkflowVersion],
|
||||
objectMetadataItems,
|
||||
objectPermissionsByObjectMetadataId,
|
||||
upsertRecordsInStore,
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
@@ -11,6 +11,7 @@ import { getObjectTypename } from '@/object-record/cache/utils/getObjectTypename
|
||||
import { getRecordNodeFromRecord } from '@/object-record/cache/utils/getRecordNodeFromRecord';
|
||||
import { useGenerateDepthRecordGqlFieldsFromObject } from '@/object-record/graphql/record-gql-fields/hooks/useGenerateDepthRecordGqlFieldsFromObject';
|
||||
import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions';
|
||||
import { useUpsertRecordsInStore } from '@/object-record/record-store/hooks/useUpsertRecordsInStore';
|
||||
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
||||
import { computeOptimisticCreateRecordBaseRecordInput } from '@/object-record/utils/computeOptimisticCreateRecordBaseRecordInput';
|
||||
import { computeOptimisticRecordFromInput } from '@/object-record/utils/computeOptimisticRecordFromInput';
|
||||
@@ -27,6 +28,7 @@ import {
|
||||
|
||||
export const useRunWorkflowVersion = () => {
|
||||
const apolloCoreClient = useApolloCoreClient();
|
||||
const { upsertRecordsInStore } = useUpsertRecordsInStore();
|
||||
|
||||
const { objectMetadataItem } = useObjectMetadataItem({
|
||||
objectNameSingular: CoreObjectNameSingular.WorkflowRun,
|
||||
@@ -128,6 +130,7 @@ export const useRunWorkflowVersion = () => {
|
||||
objectMetadataItems,
|
||||
shouldMatchRootQueryFilter: true,
|
||||
objectPermissionsByObjectMetadataId,
|
||||
upsertRecordsInStore,
|
||||
});
|
||||
|
||||
setRecordInStore(recordCreatedInCache);
|
||||
|
||||
@@ -2,16 +2,21 @@ import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSi
|
||||
import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord';
|
||||
import {
|
||||
type Workflow,
|
||||
type WorkflowVersion,
|
||||
type WorkflowWithCurrentVersion,
|
||||
} from '@/workflow/types/Workflow';
|
||||
import { useMemo } from 'react';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
type WorkflowWithAllVersions = Omit<Workflow, 'versions'> & {
|
||||
versions: Array<
|
||||
Pick<WorkflowVersion, 'id' | 'status' | 'name' | 'createdAt'>
|
||||
>;
|
||||
};
|
||||
|
||||
export const useWorkflowWithCurrentVersion = (
|
||||
workflowId: string | undefined,
|
||||
): WorkflowWithCurrentVersion | undefined => {
|
||||
// TODO: we should only load the data for the current version
|
||||
const { record: workflow } = useFindOneRecord<Workflow>({
|
||||
const { record: workflow } = useFindOneRecord<WorkflowWithAllVersions>({
|
||||
objectNameSingular: CoreObjectNameSingular.Workflow,
|
||||
objectRecordId: workflowId,
|
||||
recordGqlFields: {
|
||||
@@ -23,41 +28,38 @@ export const useWorkflowWithCurrentVersion = (
|
||||
id: true,
|
||||
status: true,
|
||||
name: true,
|
||||
steps: true,
|
||||
trigger: true,
|
||||
workflowId: true,
|
||||
deletedAt: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
},
|
||||
},
|
||||
skip: !isDefined(workflowId),
|
||||
});
|
||||
|
||||
return useMemo(() => {
|
||||
if (!isDefined(workflow)) {
|
||||
return undefined;
|
||||
}
|
||||
const draftVersion = workflow?.versions.find(
|
||||
(workflowVersion) => workflowVersion.status === 'DRAFT',
|
||||
);
|
||||
|
||||
const draftVersion = workflow.versions.find(
|
||||
(workflowVersion) => workflowVersion.status === 'DRAFT',
|
||||
);
|
||||
const workflowVersions = [...(workflow?.versions ?? [])];
|
||||
|
||||
const workflowVersions = [...workflow.versions];
|
||||
workflowVersions.sort((a, b) => (a.createdAt > b.createdAt ? -1 : 1));
|
||||
|
||||
workflowVersions.sort((a, b) => (a.createdAt > b.createdAt ? -1 : 1));
|
||||
const latestVersion = workflowVersions[0];
|
||||
|
||||
const latestVersion = workflowVersions[0];
|
||||
const currentVersionWithoutSteps = draftVersion ?? latestVersion;
|
||||
|
||||
const currentVersion = draftVersion ?? latestVersion;
|
||||
const { record: currentVersionWithSteps } = useFindOneRecord<WorkflowVersion>(
|
||||
{
|
||||
objectNameSingular: CoreObjectNameSingular.WorkflowVersion,
|
||||
objectRecordId: currentVersionWithoutSteps?.id,
|
||||
skip: !isDefined(currentVersionWithoutSteps?.id),
|
||||
},
|
||||
);
|
||||
|
||||
if (!isDefined(currentVersion)) {
|
||||
return undefined;
|
||||
}
|
||||
if (!isDefined(workflow) || !isDefined(currentVersionWithSteps)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return {
|
||||
...workflow,
|
||||
currentVersion,
|
||||
};
|
||||
}, [workflow]);
|
||||
return {
|
||||
...workflow,
|
||||
currentVersion: currentVersionWithSteps,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -131,7 +131,9 @@ export type Workflow = {
|
||||
__typename: 'Workflow';
|
||||
id: string;
|
||||
name: string;
|
||||
versions: Array<WorkflowVersion>;
|
||||
versions: Array<
|
||||
Pick<WorkflowVersion, 'id' | 'status' | 'name' | 'createdAt'>
|
||||
>;
|
||||
lastPublishedVersionId: string;
|
||||
statuses: Array<WorkflowStatus> | null;
|
||||
};
|
||||
|
||||
+4
-5
@@ -38,6 +38,8 @@ export const WorkflowDiagramEffect = () => {
|
||||
workflowLastCreatedStepIdComponentState,
|
||||
);
|
||||
|
||||
const currentVersion = workflowWithCurrentVersion?.currentVersion;
|
||||
|
||||
const computeAndMergeNewWorkflowDiagram = useRecoilCallback(
|
||||
({ snapshot, set }) => {
|
||||
return (currentVersion: WorkflowVersion) => {
|
||||
@@ -84,13 +86,10 @@ export const WorkflowDiagramEffect = () => {
|
||||
[workflowDiagramState, workflowLastCreatedStepIdState],
|
||||
);
|
||||
|
||||
const currentVersion = workflowWithCurrentVersion?.currentVersion;
|
||||
|
||||
useEffect(() => {
|
||||
if (!isDefined(currentVersion)) {
|
||||
setFlow(undefined);
|
||||
setWorkflowDiagram(undefined);
|
||||
|
||||
// setFlow(undefined);
|
||||
// setWorkflowDiagram(undefined);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user