7092 destroy connected account instead of soft deleting it (#7099)

- Create `destroyOne` endpoint
- Call `destroyOne` when removing a `connectedAccount`
This commit is contained in:
Raphaël Bosi
2024-09-17 18:30:40 +02:00
committed by GitHub
parent c42ea57b97
commit 7cdf2dc4ec
15 changed files with 241 additions and 5 deletions

View File

@ -6,7 +6,7 @@ import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadata
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache';
import { DEFAULT_MUTATION_BATCH_SIZE } from '@/object-record/constants/DefaultMutationBatchSize';
import { useDestroyManyRecordsMutation } from '@/object-record/hooks/useDestroyManyRecordMutation';
import { useDestroyManyRecordsMutation } from '@/object-record/hooks/useDestroyManyRecordsMutation';
import { getDestroyManyRecordsMutationResponseField } from '@/object-record/utils/getDestroyManyRecordsMutationResponseField';
import { useRecoilValue } from 'recoil';
import { isDefined } from '~/utils/isDefined';

View File

@ -0,0 +1,84 @@
import { useApolloClient } from '@apollo/client';
import { useCallback } from 'react';
import { triggerDeleteRecordsOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerDeleteRecordsOptimisticEffect';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache';
import { useDestroyOneRecordMutation } from '@/object-record/hooks/useDestroyOneRecordMutation';
import { getDestroyOneRecordMutationResponseField } from '@/object-record/utils/getDestroyOneRecordMutationResponseField';
import { capitalize } from '~/utils/string/capitalize';
type useDestroyOneRecordProps = {
objectNameSingular: string;
refetchFindManyQuery?: boolean;
};
export const useDestroyOneRecord = ({
objectNameSingular,
}: useDestroyOneRecordProps) => {
const apolloClient = useApolloClient();
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const getRecordFromCache = useGetRecordFromCache({
objectNameSingular,
});
const { destroyOneRecordMutation } = useDestroyOneRecordMutation({
objectNameSingular,
});
const { objectMetadataItems } = useObjectMetadataItems();
const mutationResponseField =
getDestroyOneRecordMutationResponseField(objectNameSingular);
const destroyOneRecord = useCallback(
async (idToDestroy: string) => {
const deletedRecord = await apolloClient.mutate({
mutation: destroyOneRecordMutation,
variables: { idToDestroy },
optimisticResponse: {
[mutationResponseField]: {
__typename: capitalize(objectNameSingular),
id: idToDestroy,
},
},
update: (cache, { data }) => {
const record = data?.[mutationResponseField];
if (!record) return;
const cachedRecord = getRecordFromCache(record.id, cache);
if (!cachedRecord) return;
triggerDeleteRecordsOptimisticEffect({
cache,
objectMetadataItem,
recordsToDelete: [cachedRecord],
objectMetadataItems,
});
},
});
return deletedRecord.data?.[mutationResponseField] ?? null;
},
[
apolloClient,
destroyOneRecordMutation,
getRecordFromCache,
mutationResponseField,
objectMetadataItem,
objectNameSingular,
objectMetadataItems,
],
);
return {
destroyOneRecord,
};
};

View File

@ -0,0 +1,39 @@
import gql from 'graphql-tag';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { EMPTY_MUTATION } from '@/object-record/constants/EmptyMutation';
import { getDestroyOneRecordMutationResponseField } from '@/object-record/utils/getDestroyOneRecordMutationResponseField';
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
import { capitalize } from '~/utils/string/capitalize';
export const useDestroyOneRecordMutation = ({
objectNameSingular,
}: {
objectNameSingular: string;
}) => {
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
if (isUndefinedOrNull(objectMetadataItem)) {
return { destroyOneRecordMutation: EMPTY_MUTATION };
}
const capitalizedObjectName = capitalize(objectMetadataItem.nameSingular);
const mutationResponseField = getDestroyOneRecordMutationResponseField(
objectMetadataItem.nameSingular,
);
const destroyOneRecordMutation = gql`
mutation DestroyOne${capitalizedObjectName}($idToDestroy: ID!) {
${mutationResponseField}(id: $idToDestroy) {
id
}
}
`;
return {
destroyOneRecordMutation,
};
};

View File

@ -0,0 +1,5 @@
import { capitalize } from '~/utils/string/capitalize';
export const getDestroyOneRecordMutationResponseField = (
objectNameSingular: string,
) => `destroy${capitalize(objectNameSingular)}`;