[Refactor] generateDepthOneRecordGqlFieldsFromRecord (#10499)

## Introduction
This refactor results from this
https://github.com/twentyhq/twenty/pull/10493 review
Introduced a new abstraction to the extinsting
`generateDepthOneRecordGqlFields` that was accepting an optional record
in arg in order to map generated `recordGqlFields` to the keys in the
record

1/ Created a dedicated util method
`generateDepthOneRecordGqlFieldsFromRecord` to do so
2/ Updated each previous `generateDepthOneRecordGqlFields` passing a
record to call new `generateDepthOneRecordGqlFieldsFromRecord`
This commit is contained in:
Paul Rastoin
2025-02-26 12:11:45 +01:00
committed by GitHub
parent 41a412bd55
commit ec87218b9c
10 changed files with 98 additions and 79 deletions

View File

@ -0,0 +1,49 @@
import { computeDepthOneRecordGqlFieldsFromRecord } from '@/object-record/graphql/utils/computeDepthOneRecordGqlFieldsFromRecord';
import {
getPersonObjectMetadataItem,
getPersonRecord,
} from '~/testing/mock-data/people';
describe('computeDepthOneRecordGqlFieldsFromRecord', () => {
const objectMetadataItem = getPersonObjectMetadataItem();
it('Should handle basic call', () => {
const personRecord = getPersonRecord();
const result = computeDepthOneRecordGqlFieldsFromRecord({
objectMetadataItem,
record: personRecord,
});
expect(result).toMatchInlineSnapshot(`
{
"attachments": false,
"avatarUrl": false,
"calendarEventParticipants": false,
"city": true,
"company": true,
"companyId": false,
"createdAt": true,
"createdBy": true,
"deletedAt": true,
"emails": false,
"favorites": false,
"id": true,
"intro": false,
"jobTitle": true,
"linkedinLink": true,
"messageParticipants": false,
"name": true,
"noteTargets": true,
"performanceRating": false,
"phones": true,
"pointOfContactForOpportunities": false,
"position": true,
"searchVector": false,
"taskTargets": true,
"timelineActivities": false,
"updatedAt": false,
"whatsapp": false,
"workPreference": false,
"xLink": true,
}
`);
});
});

View File

@ -1,52 +1,8 @@
import { generateDepthOneRecordGqlFields } from '@/object-record/graphql/utils/generateDepthOneRecordGqlFields';
import {
getPersonObjectMetadataItem,
getPersonRecord,
} from '~/testing/mock-data/people';
import { getPersonObjectMetadataItem } from '~/testing/mock-data/people';
describe('generateDepthOneRecordGqlFields', () => {
const objectMetadataItem = getPersonObjectMetadataItem();
it('Should handle basic call with both objectMetadataItem and record', () => {
const personRecord = getPersonRecord();
const result = generateDepthOneRecordGqlFields({
objectMetadataItem,
record: personRecord,
});
expect(result).toMatchInlineSnapshot(`
{
"attachments": false,
"avatarUrl": false,
"calendarEventParticipants": false,
"city": true,
"company": true,
"companyId": false,
"createdAt": true,
"createdBy": true,
"deletedAt": true,
"emails": false,
"favorites": false,
"id": true,
"intro": false,
"jobTitle": true,
"linkedinLink": true,
"messageParticipants": false,
"name": true,
"noteTargets": true,
"performanceRating": false,
"phones": true,
"pointOfContactForOpportunities": false,
"position": true,
"searchVector": false,
"taskTargets": true,
"timelineActivities": false,
"updatedAt": false,
"whatsapp": false,
"workPreference": false,
"xLink": true,
}
`);
});
it('Should handle basic call with standalone objectMetadataItem', () => {
const result = generateDepthOneRecordGqlFields({
objectMetadataItem,

View File

@ -0,0 +1,29 @@
import {
GenerateDepthOneRecordGqlFields,
generateDepthOneRecordGqlFields,
} from '@/object-record/graphql/utils/generateDepthOneRecordGqlFields';
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
type ComputeDepthOneRecordGqlFieldsFromRecordArgs =
GenerateDepthOneRecordGqlFields & {
record: Partial<ObjectRecord>;
};
export const computeDepthOneRecordGqlFieldsFromRecord = ({
objectMetadataItem,
record,
}: ComputeDepthOneRecordGqlFieldsFromRecordArgs) => {
const depthOneRecordGqlFields = generateDepthOneRecordGqlFields({
objectMetadataItem,
});
const recordKeys = Object.keys(record);
return Object.keys(depthOneRecordGqlFields).reduce<Record<string, boolean>>(
(acc, key) => {
return {
...acc,
[key]: recordKeys.includes(key),
};
},
depthOneRecordGqlFields,
);
};

View File

@ -1,30 +1,14 @@
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { isDefined } from 'twenty-shared';
export type GenerateDepthOneRecordGqlFields = {
objectMetadataItem: ObjectMetadataItem;
};
export const generateDepthOneRecordGqlFields = ({
objectMetadataItem,
record,
}: {
objectMetadataItem: ObjectMetadataItem;
record?: Record<string, any>;
}) => {
const gqlFieldsFromObjectMetadataItem = objectMetadataItem.fields.reduce<
Record<string, boolean>
>((acc, field) => {
}: GenerateDepthOneRecordGqlFields) =>
objectMetadataItem.fields.reduce<Record<string, true>>((acc, field) => {
return {
...acc,
[field.name]: true,
};
}, {});
if (isDefined(record)) {
return Object.keys(gqlFieldsFromObjectMetadataItem).reduce((acc, key) => {
return {
...acc,
[key]: Object.keys(record).includes(key),
};
}, gqlFieldsFromObjectMetadataItem);
}
return gqlFieldsFromObjectMetadataItem;
};