fix: updated dryrun to return correct populated record (#15484)
## Description - This PR approaches to solve https://github.com/twentyhq/twenty/issues/15201 - updated `createDryRunResponse` to return fully populated merged record - this way the frontend can render the populated data it as-is without recomputing relations - Dry-run now uses the same nested-relations population path as the non-dryRun flow --------- Co-authored-by: Etienne <45695613+etiennejouan@users.noreply.github.com>
This commit is contained in:
+15
-1
@@ -1,4 +1,4 @@
|
||||
import { FieldMetadataType } from 'twenty-shared/types';
|
||||
import { FieldMetadataType, type RelationType } from 'twenty-shared/types';
|
||||
|
||||
import { type EmailsMetadata } from 'src/engine/metadata-modules/field-metadata/composite-types/emails.composite-type';
|
||||
import { type LinksMetadata } from 'src/engine/metadata-modules/field-metadata/composite-types/links.composite-type';
|
||||
@@ -8,18 +8,32 @@ import { mergeArrayFieldValues } from './merge-array-field-values.util';
|
||||
import { mergeEmailsFieldValues } from './merge-emails-field-values.util';
|
||||
import { mergeLinksFieldValues } from './merge-links-field-values.util';
|
||||
import { mergePhonesFieldValues } from './merge-phones-field-values.util';
|
||||
import { mergeRelationFieldValuesForDryRunRecord } from './merge-relation-field-values-for-dry-run-record.util';
|
||||
import { selectPriorityFieldValue } from './select-priority-field-value.util';
|
||||
|
||||
export const mergeFieldValues = (
|
||||
fieldType: FieldMetadataType,
|
||||
recordsWithValues: { value: unknown; recordId: string }[],
|
||||
priorityRecordId: string,
|
||||
isDryRun = false,
|
||||
relationType?: RelationType,
|
||||
): unknown => {
|
||||
switch (fieldType) {
|
||||
case FieldMetadataType.ARRAY:
|
||||
case FieldMetadataType.MULTI_SELECT:
|
||||
return mergeArrayFieldValues(recordsWithValues);
|
||||
|
||||
case FieldMetadataType.RELATION:
|
||||
if (isDryRun) {
|
||||
return mergeRelationFieldValuesForDryRunRecord(
|
||||
recordsWithValues,
|
||||
relationType,
|
||||
priorityRecordId,
|
||||
);
|
||||
}
|
||||
|
||||
return selectPriorityFieldValue(recordsWithValues, priorityRecordId);
|
||||
|
||||
case FieldMetadataType.EMAILS:
|
||||
return mergeEmailsFieldValues(
|
||||
recordsWithValues as { value: EmailsMetadata; recordId: string }[],
|
||||
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
import { type ObjectRecord, RelationType } from 'twenty-shared/types';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { selectPriorityFieldValue } from 'src/engine/api/graphql/graphql-query-runner/utils/select-priority-field-value.util';
|
||||
|
||||
export const mergeRelationFieldValuesForDryRunRecord = (
|
||||
recordsWithValues: { value: unknown; recordId: string }[],
|
||||
relationType: RelationType | undefined,
|
||||
priorityRecordId: string,
|
||||
): ObjectRecord | ObjectRecord[] | null => {
|
||||
if (relationType === RelationType.ONE_TO_MANY) {
|
||||
return mergeOneToManyRelationArrays(recordsWithValues);
|
||||
}
|
||||
|
||||
return selectPriorityFieldValue(
|
||||
recordsWithValues as { value: ObjectRecord | null; recordId: string }[],
|
||||
priorityRecordId,
|
||||
);
|
||||
};
|
||||
|
||||
const mergeOneToManyRelationArrays = (
|
||||
recordsWithValues: { value: unknown; recordId: string }[],
|
||||
): ObjectRecord[] => {
|
||||
const uniqueRelationsMap = new Map<string, ObjectRecord>();
|
||||
|
||||
recordsWithValues.forEach(({ value }) => {
|
||||
if (Array.isArray(value)) {
|
||||
value.forEach((relation: ObjectRecord) => {
|
||||
if (isDefined(relation?.id)) {
|
||||
uniqueRelationsMap.set(relation.id, relation);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return Array.from(uniqueRelationsMap.values());
|
||||
};
|
||||
Reference in New Issue
Block a user