Ignore defaultValue update for select fields (#4193)

* Ignore defaultValue update for select fields

* Fix tests
This commit is contained in:
Charles Bochet
2024-02-26 18:41:29 +01:00
committed by GitHub
parent 7a437751d4
commit 6a1abba9ea
5 changed files with 48 additions and 15 deletions

View File

@ -21,7 +21,7 @@ describe('transformMetadataForComparison', () => {
{ name: 'Test2', value: { c: 3 }, extra: 'keepMe' }, { name: 'Test2', value: { c: 3 }, extra: 'keepMe' },
]; ];
const result = transformMetadataForComparison(input, { const result = transformMetadataForComparison(input, {
propertiesToIgnore: ['ignored'], shouldIgnoreProperty: (property) => ['ignored'].includes(property),
propertiesToStringify: ['value'], propertiesToStringify: ['value'],
keyFactory: (datum) => datum.name, keyFactory: (datum) => datum.name,
}); });

View File

@ -8,7 +8,7 @@ type TransformToString<T, Keys extends keyof T> = {
export function transformMetadataForComparison<T, Keys extends keyof T>( export function transformMetadataForComparison<T, Keys extends keyof T>(
fieldMetadataCollection: T[], fieldMetadataCollection: T[],
options: { options: {
propertiesToIgnore?: readonly Keys[]; shouldIgnoreProperty?: (property: string, originalMetadata?: T) => boolean;
propertiesToStringify?: readonly Keys[]; propertiesToStringify?: readonly Keys[];
keyFactory: (datum: T) => string; keyFactory: (datum: T) => string;
}, },
@ -18,7 +18,7 @@ export function transformMetadataForComparison<T, Keys extends keyof T>(
export function transformMetadataForComparison<T, Keys extends keyof T>( export function transformMetadataForComparison<T, Keys extends keyof T>(
fieldMetadataCollection: T, fieldMetadataCollection: T,
options: { options: {
propertiesToIgnore?: readonly Keys[]; shouldIgnoreProperty?: (property: string, originalMetadata?: T) => boolean;
propertiesToStringify?: readonly Keys[]; propertiesToStringify?: readonly Keys[];
}, },
): TransformToString<T, Keys>; ): TransformToString<T, Keys>;
@ -26,13 +26,11 @@ export function transformMetadataForComparison<T, Keys extends keyof T>(
export function transformMetadataForComparison<T, Keys extends keyof T>( export function transformMetadataForComparison<T, Keys extends keyof T>(
metadata: T[] | T, metadata: T[] | T,
options: { options: {
propertiesToIgnore?: readonly Keys[]; shouldIgnoreProperty?: (property: string, originalMetadata?: T) => boolean;
propertiesToStringify?: readonly Keys[]; propertiesToStringify?: readonly Keys[];
keyFactory?: (datum: T) => string; keyFactory?: (datum: T) => string;
}, },
): Record<string, TransformToString<T, Keys>> | TransformToString<T, Keys> { ): Record<string, TransformToString<T, Keys>> | TransformToString<T, Keys> {
const propertiesToIgnore = (options.propertiesToIgnore ??
[]) as readonly string[];
const propertiesToStringify = (options.propertiesToStringify ?? const propertiesToStringify = (options.propertiesToStringify ??
[]) as readonly string[]; []) as readonly string[];
@ -40,7 +38,10 @@ export function transformMetadataForComparison<T, Keys extends keyof T>(
const transformedField = {} as TransformToString<T, Keys>; const transformedField = {} as TransformToString<T, Keys>;
for (const property in datum) { for (const property in datum) {
if (propertiesToIgnore.includes(property)) { if (
options.shouldIgnoreProperty &&
options.shouldIgnoreProperty(property, datum)
) {
continue; continue;
} }
if ( if (

View File

@ -11,15 +11,16 @@ import { PartialObjectMetadata } from 'src/workspace/workspace-sync-metadata/int
import { ObjectMetadataEntity } from 'src/metadata/object-metadata/object-metadata.entity'; import { ObjectMetadataEntity } from 'src/metadata/object-metadata/object-metadata.entity';
import { transformMetadataForComparison } from 'src/workspace/workspace-sync-metadata/comparators/utils/transform-metadata-for-comparison.util'; import { transformMetadataForComparison } from 'src/workspace/workspace-sync-metadata/comparators/utils/transform-metadata-for-comparison.util';
import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity';
const fieldPropertiesToIgnore = [ const commonFieldPropertiesToIgnore = [
'id', 'id',
'createdAt', 'createdAt',
'updatedAt', 'updatedAt',
'objectMetadataId', 'objectMetadataId',
'isActive', 'isActive',
'options', 'options',
] as const; ];
const fieldPropertiesToStringify = ['targetColumnMap', 'defaultValue'] as const; const fieldPropertiesToStringify = ['targetColumnMap', 'defaultValue'] as const;
@ -36,13 +37,28 @@ export class WorkspaceFieldComparator {
string, string,
Partial<PartialFieldMetadata> Partial<PartialFieldMetadata>
> = {}; > = {};
// Double security to only compare non-custom fields // Double security to only compare non-custom fields
const filteredOriginalFieldCollection = const filteredOriginalFieldCollection =
originalObjectMetadata.fields.filter((field) => !field.isCustom); originalObjectMetadata.fields.filter((field) => !field.isCustom);
const originalFieldMetadataMap = transformMetadataForComparison( const originalFieldMetadataMap = transformMetadataForComparison(
filteredOriginalFieldCollection, filteredOriginalFieldCollection,
{ {
propertiesToIgnore: fieldPropertiesToIgnore, shouldIgnoreProperty: (property, originalMetadata) => {
if (commonFieldPropertiesToIgnore.includes(property)) {
return true;
}
if (
originalMetadata &&
property === 'defaultValue' &&
originalMetadata.type === FieldMetadataType.SELECT
) {
return true;
}
return false;
},
propertiesToStringify: fieldPropertiesToStringify, propertiesToStringify: fieldPropertiesToStringify,
keyFactory(datum) { keyFactory(datum) {
return datum.name; return datum.name;
@ -52,7 +68,21 @@ export class WorkspaceFieldComparator {
const standardFieldMetadataMap = transformMetadataForComparison( const standardFieldMetadataMap = transformMetadataForComparison(
standardObjectMetadata.fields, standardObjectMetadata.fields,
{ {
propertiesToIgnore: ['options'], shouldIgnoreProperty: (property, originalMetadata) => {
if (['options'].includes(property)) {
return true;
}
if (
originalMetadata &&
property === 'defaultValue' &&
originalMetadata.type === FieldMetadataType.SELECT
) {
return true;
}
return false;
},
propertiesToStringify: fieldPropertiesToStringify, propertiesToStringify: fieldPropertiesToStringify,
keyFactory(datum) { keyFactory(datum) {
return datum.name; return datum.name;

View File

@ -20,7 +20,7 @@ const objectPropertiesToIgnore = [
'imageIdentifierFieldMetadataId', 'imageIdentifierFieldMetadataId',
'isActive', 'isActive',
'fields', 'fields',
] as const; ];
@Injectable() @Injectable()
export class WorkspaceObjectComparator { export class WorkspaceObjectComparator {
@ -44,7 +44,8 @@ export class WorkspaceObjectComparator {
const partialOriginalObjectMetadata = transformMetadataForComparison( const partialOriginalObjectMetadata = transformMetadataForComparison(
originalObjectMetadata, originalObjectMetadata,
{ {
propertiesToIgnore: objectPropertiesToIgnore, shouldIgnoreProperty: (property) =>
objectPropertiesToIgnore.includes(property),
}, },
); );

View File

@ -10,7 +10,7 @@ import {
import { RelationMetadataEntity } from 'src/metadata/relation-metadata/relation-metadata.entity'; import { RelationMetadataEntity } from 'src/metadata/relation-metadata/relation-metadata.entity';
import { transformMetadataForComparison } from 'src/workspace/workspace-sync-metadata/comparators/utils/transform-metadata-for-comparison.util'; import { transformMetadataForComparison } from 'src/workspace/workspace-sync-metadata/comparators/utils/transform-metadata-for-comparison.util';
const relationPropertiesToIgnore = ['createdAt', 'updatedAt'] as const; const relationPropertiesToIgnore = ['createdAt', 'updatedAt'];
const relationPropertiesToUpdate = ['onDeleteAction']; const relationPropertiesToUpdate = ['onDeleteAction'];
@Injectable() @Injectable()
@ -38,7 +38,8 @@ export class WorkspaceRelationComparator {
const originalRelationMetadataMap = transformMetadataForComparison( const originalRelationMetadataMap = transformMetadataForComparison(
originalRelationMetadataCollection, originalRelationMetadataCollection,
{ {
propertiesToIgnore: relationPropertiesToIgnore, shouldIgnoreProperty: (property) =>
relationPropertiesToIgnore.includes(property),
keyFactory(relationMetadata) { keyFactory(relationMetadata) {
return `${relationMetadata.fromObjectMetadataId}->${relationMetadata.fromFieldMetadataId}`; return `${relationMetadata.fromObjectMetadataId}->${relationMetadata.fromFieldMetadataId}`;
}, },