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:
Thomas Trompette
2025-10-12 18:06:12 +02:00
committed by GitHub
parent 0fb2d66808
commit 7b84db4708
54 changed files with 485 additions and 259 deletions
@@ -2,6 +2,8 @@ import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { deleteRecordFromCache } from '@/object-record/cache/utils/deleteRecordFromCache';
import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions';
import { useUpsertRecordsInStore } from '@/object-record/record-store/hooks/useUpsertRecordsInStore';
import { type ObjectRecord } from '@/object-record/types/ObjectRecord';
export const useDeleteRecordFromCache = ({
@@ -10,11 +12,12 @@ export const useDeleteRecordFromCache = ({
objectNameSingular: string;
}) => {
const apolloCoreClient = useApolloCoreClient();
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const { upsertRecordsInStore } = useUpsertRecordsInStore();
const { objectMetadataItems } = useObjectMetadataItems();
return (recordToDestroy: ObjectRecord) => {
@@ -23,6 +26,8 @@ export const useDeleteRecordFromCache = ({
objectMetadataItems,
recordToDestroy,
cache: apolloCoreClient.cache,
upsertRecordsInStore,
objectPermissionsByObjectMetadataId,
});
};
};
@@ -4,17 +4,25 @@ import { triggerDestroyRecordsOptimisticEffect } from '@/apollo/optimistic-effec
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { getObjectTypename } from '@/object-record/cache/utils/getObjectTypename';
import { type ObjectRecord } from '@/object-record/types/ObjectRecord';
import { type ObjectPermissions } from 'twenty-shared/types';
export const deleteRecordFromCache = ({
objectMetadataItem,
objectMetadataItems,
recordToDestroy,
cache,
upsertRecordsInStore,
objectPermissionsByObjectMetadataId,
}: {
objectMetadataItem: ObjectMetadataItem;
objectMetadataItems: ObjectMetadataItem[];
recordToDestroy: ObjectRecord;
cache: ApolloCache<object>;
objectPermissionsByObjectMetadataId: Record<
string,
ObjectPermissions & { objectMetadataId: string }
>;
upsertRecordsInStore: (records: ObjectRecord[]) => void;
}) => {
triggerDestroyRecordsOptimisticEffect({
cache,
@@ -26,5 +34,7 @@ export const deleteRecordFromCache = ({
__typename: getObjectTypename(objectMetadataItem.nameSingular),
},
],
upsertRecordsInStore,
objectPermissionsByObjectMetadataId,
});
};
@@ -12,10 +12,13 @@ import { isEmptyObject } from '~/utils/isEmptyObject';
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
export type GetRecordFromCacheArgs = {
cache: ApolloCache<object>;
cache: ApolloCache<unknown>;
recordId: string;
objectMetadataItems: ObjectMetadataItem[];
objectMetadataItem: ObjectMetadataItem;
objectMetadataItem: Pick<
ObjectMetadataItem,
'fields' | 'nameSingular' | 'id' | 'readableFields'
>;
recordGqlFields?: RecordGqlFields;
objectPermissionsByObjectMetadataId: Record<
string,