From a6b57cb459a062e0a752b041e4259d575c85715e Mon Sep 17 00:00:00 2001 From: kjac Date: Wed, 15 May 2024 11:35:15 +0200 Subject: [PATCH] Clean up null values in datatype configs --- .../Migrations/Upgrade/UmbracoPlan.cs | 1 + .../V_14_0_0/CleanUpDataTypeConfigurations.cs | 66 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 src/Umbraco.Infrastructure/Migrations/Upgrade/V_14_0_0/CleanUpDataTypeConfigurations.cs diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs index 1789a82f8b3d..39d29f6da3bd 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs @@ -81,5 +81,6 @@ protected virtual void DefinePlan() To("{8184E61D-ECBA-4AAA-B61B-D7A82EB82EB7}"); To("{E261BF01-2C7F-4544-BAE7-49D545B21D68}"); To("{5A2EF07D-37B4-49D5-8E9B-3ED01877263B}"); + To("{827360CA-0855-42A5-8F86-A51F168CB559}"); } } diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_14_0_0/CleanUpDataTypeConfigurations.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_14_0_0/CleanUpDataTypeConfigurations.cs new file mode 100644 index 000000000000..9da9b61873b0 --- /dev/null +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_14_0_0/CleanUpDataTypeConfigurations.cs @@ -0,0 +1,66 @@ +using Microsoft.Extensions.Logging; +using NPoco; +using Umbraco.Cms.Core.Serialization; +using Umbraco.Cms.Infrastructure.Persistence; +using Umbraco.Cms.Infrastructure.Persistence.Dtos; +using Umbraco.Extensions; + +namespace Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_14_0_0; + +public class CleanUpDataTypeConfigurations : MigrationBase +{ + private readonly IConfigurationEditorJsonSerializer _configurationEditorJsonSerializer; + private readonly ILogger _logger; + + public CleanUpDataTypeConfigurations( + IMigrationContext context, + IConfigurationEditorJsonSerializer configurationEditorJsonSerializer, + ILogger logger) + : base(context) + { + _configurationEditorJsonSerializer = configurationEditorJsonSerializer; + _logger = logger; + } + + protected override void Migrate() + { + Sql sql = Sql() + .Select() + .AndSelect() + .From() + .InnerJoin() + .On(left => left.NodeId, right => right.NodeId) + .Where(x => x.EditorAlias.Contains("Umbraco.")); + + List dataTypeDtos = Database.Fetch(sql); + + foreach (DataTypeDto dataTypeDto in dataTypeDtos) + { + try + { + Dictionary configurationData = dataTypeDto.Configuration.IsNullOrWhiteSpace() + ? new Dictionary() + : _configurationEditorJsonSerializer + .Deserialize>(dataTypeDto.Configuration) + ?? new Dictionary(); + + var configurationDataWithoutNullValues = configurationData + .Where(pair => pair.Value is not null) + .ToDictionary(pair => pair.Key, pair => pair.Value!); + + if (configurationData.Count == configurationDataWithoutNullValues.Count) + { + continue; + } + + dataTypeDto.Configuration = _configurationEditorJsonSerializer.Serialize(configurationDataWithoutNullValues); + Database.Update(dataTypeDto); + _logger.LogInformation("Configuration cleaned up for data type: {dataTypeName} (id: {dataTypeId}, editor alias: {dataTypeEditorAlias})", dataTypeDto.NodeDto?.Text, dataTypeDto.NodeId, dataTypeDto.EditorAlias); + } + catch (Exception ex) + { + _logger.LogError(ex, "Configuration clean-up failed for data type: {dataTypeName} (id: {dataTypeId}, editor alias: {dataTypeEditorAlias})", dataTypeDto.NodeDto?.Text, dataTypeDto.NodeId, dataTypeDto.EditorAlias); + } + } + } +}