add WorkspaceDuplicateCriteria decorator + update duplicate resolver logic (#10128)

## Context

All objects have '...duplicates' resolver but only companies and people
have duplicate criteria (hard coded constant).
Gql schema and resolver should be created only if duplicate criteria
exist.

## Solution

- Add a new @WorkspaceDuplicateCriteria decorator at object level,
defining duplicate criteria for given object.
- Add a new duplicate criteria field in ObjectMetadata table
- Update schema and resolver building logic
- Update front requests for duplicate check (only for object with
criteria defined)



closes https://github.com/twentyhq/twenty/issues/9828
This commit is contained in:
Etienne
2025-02-12 17:32:59 +01:00
committed by GitHub
parent b66289c44c
commit 0609b31c64
29 changed files with 491 additions and 121 deletions

View File

@ -23,6 +23,7 @@ export const FIND_MANY_OBJECT_METADATA_ITEMS = gql`
imageIdentifierFieldMetadataId
shortcut
isLabelSyncedWithName
duplicateCriteria
indexMetadatas(paging: { first: 100 }) {
edges {
node {

View File

@ -17,6 +17,7 @@ export const useFindDuplicateRecords = <T extends ObjectRecord = ObjectRecord>({
objectRecordIds = [],
objectNameSingular,
onCompleted,
skip,
}: ObjectMetadataItemIdentifier & {
objectRecordIds: string[] | undefined;
onCompleted?: (data: RecordGqlConnection[]) => void;
@ -42,6 +43,7 @@ export const useFindDuplicateRecords = <T extends ObjectRecord = ObjectRecord>({
useQuery<RecordGqlOperationFindDuplicatesResult>(
findDuplicateRecordsQuery,
{
skip: !!skip,
variables: {
ids: objectRecordIds,
},

View File

@ -1,9 +1,11 @@
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { RecordChip } from '@/object-record/components/RecordChip';
import { useFindDuplicateRecords } from '@/object-record/hooks/useFindDuplicateRecords';
import { RecordDetailRecordsList } from '@/object-record/record-show/record-detail-section/components/RecordDetailRecordsList';
import { RecordDetailRecordsListItem } from '@/object-record/record-show/record-detail-section/components/RecordDetailRecordsListItem';
import { RecordDetailSection } from '@/object-record/record-show/record-detail-section/components/RecordDetailSection';
import { RecordDetailSectionHeader } from '@/object-record/record-show/record-detail-section/components/RecordDetailSectionHeader';
import { isDefined } from 'twenty-shared';
export const RecordDetailDuplicatesSection = ({
objectRecordId,
@ -12,9 +14,14 @@ export const RecordDetailDuplicatesSection = ({
objectRecordId: string;
objectNameSingular: string;
}) => {
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const { results: queryResults } = useFindDuplicateRecords({
objectRecordIds: [objectRecordId],
objectNameSingular,
skip: !isDefined(objectMetadataItem.duplicateCriteria),
});
if (!queryResults || !queryResults[0] || queryResults[0].length === 0)