Skip to content

Commit

Permalink
Core - Add migration to also migrate profile activation conditions
Browse files Browse the repository at this point in the history
  • Loading branch information
RobertBeekman committed Feb 25, 2024
1 parent 2e600e7 commit 5203e95
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 12 deletions.
26 changes: 16 additions & 10 deletions src/Artemis.Core/Services/Storage/ProfileService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -458,19 +458,23 @@ public async Task<ProfileConfiguration> ImportProfile(Stream archiveStream, Prof
if (profileEntry == null)
throw new ArtemisCoreException("Could not import profile, profile.json missing");

// Deserialize profile configuration to JObject
await using Stream configurationStream = configurationEntry.Open();
using StreamReader configurationReader = new(configurationStream);
ProfileConfigurationEntity? configurationEntity = JsonConvert.DeserializeObject<ProfileConfigurationEntity>(await configurationReader.ReadToEndAsync(), IProfileService.ExportSettings);
if (configurationEntity == null)
throw new ArtemisCoreException("Could not import profile, failed to deserialize configuration.json");

JObject? configurationJson = JsonConvert.DeserializeObject<JObject>(await configurationReader.ReadToEndAsync(), IProfileService.ExportSettings);
// Deserialize profile to JObject
await using Stream profileStream = profileEntry.Open();
using StreamReader profileReader = new(profileStream);
JObject? profileJson = JsonConvert.DeserializeObject<JObject>(await profileReader.ReadToEndAsync(), IProfileService.ExportSettings);

// Before deserializing, apply any pending migrations
MigrateProfile(configurationEntity, profileJson);
MigrateProfile(configurationJson, profileJson);

// Deserialize profile configuration to ProfileConfigurationEntity
ProfileConfigurationEntity? configurationEntity = configurationJson?.ToObject<ProfileConfigurationEntity>(JsonSerializer.Create(IProfileService.ExportSettings));
if (configurationEntity == null)
throw new ArtemisCoreException("Could not import profile, failed to deserialize configuration.json");
// Deserialize profile to ProfileEntity
ProfileEntity? profileEntity = profileJson?.ToObject<ProfileEntity>(JsonSerializer.Create(IProfileService.ExportSettings));
if (profileEntity == null)
throw new ArtemisCoreException("Could not import profile, failed to deserialize profile.json");
Expand Down Expand Up @@ -555,18 +559,20 @@ private void InputServiceOnKeyboardKeyUp(object? sender, ArtemisKeyboardKeyEvent
}
}

private void MigrateProfile(ProfileConfigurationEntity configurationEntity, JObject? profileJson)
private void MigrateProfile(JObject? configurationJson, JObject? profileJson)
{
if (profileJson == null)
if (configurationJson == null || profileJson == null)
return;

configurationJson["Version"] ??= 0;

foreach (IProfileMigration profileMigrator in _profileMigrators.OrderBy(m => m.Version))
{
if (profileMigrator.Version <= configurationEntity.Version)
if (profileMigrator.Version <= configurationJson["Version"]!.Value<int>())
continue;

profileMigrator.Migrate(profileJson);
configurationEntity.Version = profileMigrator.Version;
profileMigrator.Migrate(configurationJson, profileJson);
configurationJson["Version"] = profileMigrator.Version;
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/Artemis.Storage/Migrations/IProfileMigration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ namespace Artemis.Storage.Migrations;
public interface IProfileMigration
{
int Version { get; }
void Migrate(JObject profileJson);
void Migrate(JObject configurationJson, JObject profileJson);
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ internal class M0001NodeProviders : IProfileMigration
public int Version => 1;

/// <inheritdoc />
public void Migrate(JObject profileJson)
public void Migrate(JObject configurationJson, JObject profileJson)
{
JArray? folders = (JArray?) profileJson["Folders"]?["$values"];
JArray? layers = (JArray?) profileJson["Layers"]?["$values"];
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using Newtonsoft.Json.Linq;

namespace Artemis.Storage.Migrations.Profile;

/// <summary>
/// Migrates nodes to be provider-based on profile configurations as well..
/// This requires giving them a ProviderId and updating the their namespaces to match the namespace of the new plugin.
/// </summary>
internal class M0002NodeProvidersProfileConfig : IProfileMigration
{
/// <inheritdoc />
public int Version => 2;

/// <inheritdoc />
public void Migrate(JObject configurationJson, JObject profileJson)
{
MigrateNodeScript(configurationJson["ActivationCondition"]);
}

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<string>()?.Replace("Artemis.VisualScripting.Nodes", "Artemis.Plugins.Nodes.General.Nodes");
node["ProviderId"] = "Artemis.Plugins.Nodes.General.GeneralNodesProvider-d9e1ee78";
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using LiteDB;

namespace Artemis.Storage.Migrations.Storage;

public class M0025NodeProvidersProfileConfig : IStorageMigration
{
public int UserVersion => 25;

public void Apply(LiteRepository repository)
{
ILiteCollection<BsonDocument> categoryCollection = repository.Database.GetCollection("ProfileCategoryEntity");
foreach (BsonDocument profileCategoryBson in categoryCollection.FindAll())
{
BsonArray? profiles = profileCategoryBson["ProfileConfigurations"]?.AsArray;
if (profiles != null)
{
foreach (BsonValue profile in profiles)
{
profile["Version"] = 2;
MigrateNodeScript(profile["ActivationCondition"]?.AsDocument);
}
}
categoryCollection.Update(profileCategoryBson);
}
}

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";
}
}
}

0 comments on commit 5203e95

Please sign in to comment.