diff --git a/source/Cute.Lib/Contentful/BulkActions/Actions/UpsertBulkAction.cs b/source/Cute.Lib/Contentful/BulkActions/Actions/UpsertBulkAction.cs index ef83b6b..bae2e68 100644 --- a/source/Cute.Lib/Contentful/BulkActions/Actions/UpsertBulkAction.cs +++ b/source/Cute.Lib/Contentful/BulkActions/Actions/UpsertBulkAction.cs @@ -428,30 +428,41 @@ private bool ValuesDiffer( var contentDisplayField = _contentType!.DisplayField; - foreach (var (fieldName, value) in localFlatEntry) - { - if (fieldName.StartsWith("sys.")) continue; + var allFieldNames = localFlatEntry.Keys + .Concat(cloudFlatEntry.Keys) + .Where(fieldName => !fieldName.StartsWith("sys.")) + .ToHashSet(); - string? oldValue = null; + foreach (var fieldName in allFieldNames) + { + var existsInLocal = localFlatEntry.TryGetValue(fieldName, out var localValue); + var existsInCloud = cloudFlatEntry.TryGetValue(fieldName, out var cloudValue); - if (cloudFlatEntry.TryGetValue(fieldName, out var oldValueObj)) + if (existsInLocal) { - oldValue = cloudFlatEntry[fieldName]?.ToString(); - } + string? oldValue = cloudValue?.ToString(); - var isFieldChanged = serializer.CompareAndUpdateEntry(cloudFlatEntry, fieldName, value, _appendFields); + var isFieldChanged = serializer.CompareAndUpdateEntry(cloudFlatEntry, fieldName, localValue, _appendFields); - if (isFieldChanged) + if (isFieldChanged) + { + changedFields.Add(fieldName, (oldValue, localValue)); + isChanged = true; + } + } + else if (existsInCloud && !string.IsNullOrEmpty(cloudValue?.ToString())) { - changedFields.Add(fieldName, (oldValue, value)); + changedFields.Add(fieldName, (cloudValue?.ToString(), null)); + cloudFlatEntry.Remove(fieldName); + isChanged = true; } - - isChanged = isFieldChanged || isChanged; } if (isChanged) { - var newEntryName = localFlatEntry.ContainsKey($"{contentDisplayField}.{defaultLocale}") ? localFlatEntry[$"{contentDisplayField}.{defaultLocale}"] : localFlatEntry[$"{_matchField}.{defaultLocale}"]; + var newEntryName = localFlatEntry.ContainsKey($"{contentDisplayField}.{defaultLocale}") + ? localFlatEntry[$"{contentDisplayField}.{defaultLocale}"] + : localFlatEntry[$"{_matchField}.{defaultLocale}"]; NotifyUserInterface($"'{_contentTypeId}' - '{newEntryName}' will be updated.", progressUpdater);