From 49ed0205b7223c41808e67fce03c37ba7045f4e4 Mon Sep 17 00:00:00 2001 From: Robert Date: Fri, 23 Feb 2024 20:58:32 +0100 Subject: [PATCH] Move migrations to storage, add Storage migration for nodes change --- .../DryIoc/ContainerExtensions.cs | 4 +- .../Storage/Interfaces/IProfileMigration.cs | 9 -- .../ProfileMigrators/M0001NodeProviders.cs | 90 ---------------- .../Services/Storage/ProfileService.cs | 5 +- .../Migrations/IProfileMigration.cs | 4 +- .../Migrations/IStorageMigration.cs | 2 +- .../Migrations/Profile/M0001NodeProviders.cs | 9 -- .../Migrations/Storage/M0020AvaloniaReset.cs | 3 +- .../Migrations/Storage/M0021GradientNodes.cs | 3 +- .../Storage/M0022TransitionNodes.cs | 3 +- .../Storage/M0023LayoutProviders.cs | 3 +- .../Migrations/Storage/M0024NodeProviders.cs | 100 ++++++++++++++++++ .../StorageMigrationService.cs | 2 +- 13 files changed, 112 insertions(+), 125 deletions(-) delete mode 100644 src/Artemis.Core/Services/Storage/Interfaces/IProfileMigration.cs delete mode 100644 src/Artemis.Core/Services/Storage/ProfileMigrators/M0001NodeProviders.cs create mode 100644 src/Artemis.Storage/Migrations/Storage/M0024NodeProviders.cs diff --git a/src/Artemis.Core/DryIoc/ContainerExtensions.cs b/src/Artemis.Core/DryIoc/ContainerExtensions.cs index 337fb1def..8aa35b65f 100644 --- a/src/Artemis.Core/DryIoc/ContainerExtensions.cs +++ b/src/Artemis.Core/DryIoc/ContainerExtensions.cs @@ -5,7 +5,7 @@ using Artemis.Core.Providers; using Artemis.Core.Services; using Artemis.Storage; -using Artemis.Storage.Migrations.Interfaces; +using Artemis.Storage.Migrations; using Artemis.Storage.Repositories.Interfaces; using DryIoc; @@ -36,7 +36,7 @@ public static void RegisterCore(this IContainer container) // Bind migrations container.RegisterMany(storageAssembly, type => type.IsAssignableTo(), Reuse.Singleton, nonPublicServiceTypes: true); - container.RegisterMany(coreAssembly, type => type.IsAssignableTo(), Reuse.Singleton, nonPublicServiceTypes: true); + container.RegisterMany(storageAssembly, type => type.IsAssignableTo(), Reuse.Singleton, nonPublicServiceTypes: true); container.RegisterMany(coreAssembly, type => type.IsAssignableTo(), Reuse.Singleton); container.Register(Reuse.Singleton); diff --git a/src/Artemis.Core/Services/Storage/Interfaces/IProfileMigration.cs b/src/Artemis.Core/Services/Storage/Interfaces/IProfileMigration.cs deleted file mode 100644 index 7365014e8..000000000 --- a/src/Artemis.Core/Services/Storage/Interfaces/IProfileMigration.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Newtonsoft.Json.Linq; - -namespace Artemis.Core.Services; - -internal interface IProfileMigration -{ - int Version { get; } - void Migrate(JObject profileJson); -} \ No newline at end of file diff --git a/src/Artemis.Core/Services/Storage/ProfileMigrators/M0001NodeProviders.cs b/src/Artemis.Core/Services/Storage/ProfileMigrators/M0001NodeProviders.cs deleted file mode 100644 index c55fde0a9..000000000 --- a/src/Artemis.Core/Services/Storage/ProfileMigrators/M0001NodeProviders.cs +++ /dev/null @@ -1,90 +0,0 @@ -using Newtonsoft.Json.Linq; - -namespace Artemis.Core.Services.ProfileMigrators; - -/// -/// Migrates nodes to be provider-based. -/// This requires giving them a ProviderId and updating the their namespaces to match the namespace of the new plugin. -/// -internal class M0001NodeProviders : IProfileMigration -{ - /// - public int Version => 1; - - /// - public void Migrate(JObject profileJson) - { - JArray? folders = (JArray?) profileJson["Folders"]?["$values"]; - JArray? layers = (JArray?) profileJson["Layers"]?["$values"]; - - if (folders != null) - { - foreach (JToken folder in folders) - { - MigrateProfileElement(folder); - } - } - - if (layers != null) - { - foreach (JToken layer in layers) - { - MigrateProfileElement(layer); - MigratePropertyGroup(layer["GeneralPropertyGroup"]); - MigratePropertyGroup(layer["TransformPropertyGroup"]); - MigratePropertyGroup(layer["LayerBrush"]?["PropertyGroup"]); - } - } - } - - private void MigrateProfileElement(JToken profileElement) - { - JArray? layerEffects = (JArray?) profileElement["LayerEffects"]?["$values"]; - if (layerEffects != null) - { - foreach (JToken layerEffect in layerEffects) - MigratePropertyGroup(layerEffect["PropertyGroup"]); - } - - JToken? displayCondition = profileElement["DisplayCondition"]; - if (displayCondition != null) - MigrateNodeScript(displayCondition["Script"]); - } - - private void MigratePropertyGroup(JToken? propertyGroup) - { - if (propertyGroup == null || !propertyGroup.HasValues) - return; - - JArray? properties = (JArray?) propertyGroup["Properties"]?["$values"]; - JArray? propertyGroups = (JArray?) propertyGroup["PropertyGroups"]?["$values"]; - - if (properties != null) - { - foreach (JToken property in properties) - MigrateNodeScript(property["DataBinding"]?["NodeScript"]); - } - - if (propertyGroups != null) - { - foreach (JToken childPropertyGroup in propertyGroups) - MigratePropertyGroup(childPropertyGroup); - } - } - - private void MigrateNodeScript(JToken? nodeScript) - { - if (nodeScript == null || !nodeScript.HasValues) - return; - - JArray? nodes = (JArray?) nodeScript["Nodes"]?["$values"]; - if (nodes == null) - return; - - foreach (JToken node in nodes) - { - node["Type"] = node["Type"]?.Value()?.Replace("Artemis.VisualScripting.Nodes", "Artemis.Plugins.Nodes.General.Nodes"); - node["ProviderId"] = "Artemis.Plugins.Nodes.General.GeneralNodesProvider-d9e1ee78"; - } - } -} \ No newline at end of file diff --git a/src/Artemis.Core/Services/Storage/ProfileService.cs b/src/Artemis.Core/Services/Storage/ProfileService.cs index e49230003..90b25ea5f 100644 --- a/src/Artemis.Core/Services/Storage/ProfileService.cs +++ b/src/Artemis.Core/Services/Storage/ProfileService.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using Artemis.Core.Modules; using Artemis.Storage.Entities.Profile; +using Artemis.Storage.Migrations; using Artemis.Storage.Repositories.Interfaces; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -523,10 +524,10 @@ public async Task ImportProfile(Stream archiveStream, Prof public async Task OverwriteProfile(MemoryStream archiveStream, ProfileConfiguration profileConfiguration) { ProfileConfiguration imported = await ImportProfile(archiveStream, profileConfiguration.Category, true, true, null, profileConfiguration.Order + 1); - + DeleteProfile(profileConfiguration); SaveProfileCategory(imported.Category); - + return imported; } diff --git a/src/Artemis.Storage/Migrations/IProfileMigration.cs b/src/Artemis.Storage/Migrations/IProfileMigration.cs index d48cab32b..1bb41c022 100644 --- a/src/Artemis.Storage/Migrations/IProfileMigration.cs +++ b/src/Artemis.Storage/Migrations/IProfileMigration.cs @@ -1,11 +1,9 @@ -using LiteDB; using Newtonsoft.Json.Linq; namespace Artemis.Storage.Migrations; -internal interface IProfileMigration +public interface IProfileMigration { int Version { get; } void Migrate(JObject profileJson); - void Migrate(BsonDocument profileBson); } \ No newline at end of file diff --git a/src/Artemis.Storage/Migrations/IStorageMigration.cs b/src/Artemis.Storage/Migrations/IStorageMigration.cs index dbee4bcba..4382a837d 100644 --- a/src/Artemis.Storage/Migrations/IStorageMigration.cs +++ b/src/Artemis.Storage/Migrations/IStorageMigration.cs @@ -1,6 +1,6 @@ using LiteDB; -namespace Artemis.Storage.Migrations.Interfaces; +namespace Artemis.Storage.Migrations; public interface IStorageMigration { diff --git a/src/Artemis.Storage/Migrations/Profile/M0001NodeProviders.cs b/src/Artemis.Storage/Migrations/Profile/M0001NodeProviders.cs index 9e8f62f1f..0dfab33a2 100644 --- a/src/Artemis.Storage/Migrations/Profile/M0001NodeProviders.cs +++ b/src/Artemis.Storage/Migrations/Profile/M0001NodeProviders.cs @@ -1,4 +1,3 @@ -using LiteDB; using Newtonsoft.Json.Linq; namespace Artemis.Storage.Migrations.Profile; @@ -21,9 +20,7 @@ public void Migrate(JObject profileJson) if (folders != null) { foreach (JToken folder in folders) - { MigrateProfileElement(folder); - } } if (layers != null) @@ -38,12 +35,6 @@ public void Migrate(JObject profileJson) } } - /// - public void Migrate(BsonDocument profileBson) - { - throw new System.NotImplementedException(); - } - private void MigrateProfileElement(JToken profileElement) { JArray? layerEffects = (JArray?) profileElement["LayerEffects"]?["$values"]; diff --git a/src/Artemis.Storage/Migrations/Storage/M0020AvaloniaReset.cs b/src/Artemis.Storage/Migrations/Storage/M0020AvaloniaReset.cs index 741ba35b0..293fc1ff7 100644 --- a/src/Artemis.Storage/Migrations/Storage/M0020AvaloniaReset.cs +++ b/src/Artemis.Storage/Migrations/Storage/M0020AvaloniaReset.cs @@ -1,9 +1,8 @@ using System.Collections.Generic; using System.Linq; -using Artemis.Storage.Migrations.Interfaces; using LiteDB; -namespace Artemis.Storage.Migrations; +namespace Artemis.Storage.Migrations.Storage; public class M0020AvaloniaReset : IStorageMigration { diff --git a/src/Artemis.Storage/Migrations/Storage/M0021GradientNodes.cs b/src/Artemis.Storage/Migrations/Storage/M0021GradientNodes.cs index b41e7a983..2bb90a45c 100644 --- a/src/Artemis.Storage/Migrations/Storage/M0021GradientNodes.cs +++ b/src/Artemis.Storage/Migrations/Storage/M0021GradientNodes.cs @@ -3,10 +3,9 @@ using System.Linq; using Artemis.Storage.Entities.Profile; using Artemis.Storage.Entities.Profile.Nodes; -using Artemis.Storage.Migrations.Interfaces; using LiteDB; -namespace Artemis.Storage.Migrations; +namespace Artemis.Storage.Migrations.Storage; public class M0021GradientNodes : IStorageMigration { diff --git a/src/Artemis.Storage/Migrations/Storage/M0022TransitionNodes.cs b/src/Artemis.Storage/Migrations/Storage/M0022TransitionNodes.cs index 6256c097d..791b95ea9 100644 --- a/src/Artemis.Storage/Migrations/Storage/M0022TransitionNodes.cs +++ b/src/Artemis.Storage/Migrations/Storage/M0022TransitionNodes.cs @@ -3,10 +3,9 @@ using Artemis.Storage.Entities.Profile.Abstract; using Artemis.Storage.Entities.Profile.Conditions; using Artemis.Storage.Entities.Profile.Nodes; -using Artemis.Storage.Migrations.Interfaces; using LiteDB; -namespace Artemis.Storage.Migrations; +namespace Artemis.Storage.Migrations.Storage; public class M0022TransitionNodes : IStorageMigration { diff --git a/src/Artemis.Storage/Migrations/Storage/M0023LayoutProviders.cs b/src/Artemis.Storage/Migrations/Storage/M0023LayoutProviders.cs index 5914b01c2..5296d5842 100644 --- a/src/Artemis.Storage/Migrations/Storage/M0023LayoutProviders.cs +++ b/src/Artemis.Storage/Migrations/Storage/M0023LayoutProviders.cs @@ -1,8 +1,7 @@ using System.Collections.Generic; -using Artemis.Storage.Migrations.Interfaces; using LiteDB; -namespace Artemis.Storage.Migrations; +namespace Artemis.Storage.Migrations.Storage; public class M0023LayoutProviders : IStorageMigration { diff --git a/src/Artemis.Storage/Migrations/Storage/M0024NodeProviders.cs b/src/Artemis.Storage/Migrations/Storage/M0024NodeProviders.cs new file mode 100644 index 000000000..4d0a4211e --- /dev/null +++ b/src/Artemis.Storage/Migrations/Storage/M0024NodeProviders.cs @@ -0,0 +1,100 @@ +using System.Collections.Generic; +using Artemis.Storage.Entities.Profile; +using LiteDB; + +namespace Artemis.Storage.Migrations.Storage; + +public class M0024NodeProviders : IStorageMigration +{ + public int UserVersion => 24; + + public void Apply(LiteRepository repository) + { + List profileCategories = repository.Query().ToList(); + foreach (ProfileCategoryEntity profileCategory in profileCategories) + { + foreach (ProfileConfigurationEntity profileConfigurationEntity in profileCategory.ProfileConfigurations) + { + profileConfigurationEntity.Version = 1; + } + repository.Update(profileCategory); + } + + ILiteCollection collection = repository.Database.GetCollection("ProfileEntity"); + foreach (BsonDocument profileBson in collection.FindAll()) + { + BsonArray? folders = profileBson["Folders"]?.AsArray; + BsonArray? layers = profileBson["Layers"]?.AsArray; + + if (folders != null) + { + foreach (BsonValue folder in folders) + MigrateProfileElement(folder.AsDocument); + } + + if (layers != null) + { + foreach (BsonValue layer in layers) + { + MigrateProfileElement(layer.AsDocument); + MigratePropertyGroup(layer.AsDocument["GeneralPropertyGroup"].AsDocument); + MigratePropertyGroup(layer.AsDocument["TransformPropertyGroup"].AsDocument); + MigratePropertyGroup(layer.AsDocument["LayerBrush"]?["PropertyGroup"].AsDocument); + } + } + + collection.Update(profileBson); + } + } + + private void MigrateProfileElement(BsonDocument profileElement) + { + BsonArray? layerEffects = profileElement["LayerEffects"]?.AsArray; + if (layerEffects != null) + { + foreach (BsonValue layerEffect in layerEffects) + MigratePropertyGroup(layerEffect.AsDocument["PropertyGroup"].AsDocument); + } + + BsonValue? displayCondition = profileElement["DisplayCondition"]; + if (displayCondition != null) + MigrateNodeScript(displayCondition.AsDocument["Script"].AsDocument); + } + + private void MigratePropertyGroup(BsonDocument? propertyGroup) + { + if (propertyGroup == null || propertyGroup.Keys.Count == 0) + return; + + BsonArray? properties = propertyGroup["Properties"]?.AsArray; + BsonArray? propertyGroups = propertyGroup["PropertyGroups"]?.AsArray; + + if (properties != null) + { + foreach (BsonValue property in properties) + MigrateNodeScript(property.AsDocument["DataBinding"]?["NodeScript"]?.AsDocument); + } + + if (propertyGroups != null) + { + foreach (BsonValue childPropertyGroup in propertyGroups) + MigratePropertyGroup(childPropertyGroup.AsDocument); + } + } + + private void MigrateNodeScript(BsonDocument? nodeScript) + { + if (nodeScript == null || nodeScript.Keys.Count == 0) + return; + + BsonArray? nodes = nodeScript["Nodes"]?.AsArray; + if (nodes == null) + return; + + foreach (BsonValue node in nodes) + { + node.AsDocument["Type"] = node.AsDocument["Type"]?.AsString?.Replace("Artemis.VisualScripting.Nodes", "Artemis.Plugins.Nodes.General.Nodes"); + node.AsDocument["ProviderId"] = "Artemis.Plugins.Nodes.General.GeneralNodesProvider-d9e1ee78"; + } + } +} \ No newline at end of file diff --git a/src/Artemis.Storage/StorageMigrationService.cs b/src/Artemis.Storage/StorageMigrationService.cs index 169144e5c..cf728023b 100644 --- a/src/Artemis.Storage/StorageMigrationService.cs +++ b/src/Artemis.Storage/StorageMigrationService.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; -using Artemis.Storage.Migrations.Interfaces; +using Artemis.Storage.Migrations; using LiteDB; using Serilog;