[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:
@ -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,
|
||||
}
|
||||
`);
|
||||
});
|
||||
});
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
);
|
||||
};
|
||||
@ -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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user