Browse Source

GuidMapper

pull/311/head
Sebastian 7 years ago
parent
commit
cbc6f3600c
  1. 2
      src/Squidex.Domain.Apps.Entities/Backup/BackupHandlerWithStore.cs
  2. 82
      src/Squidex.Domain.Apps.Entities/Backup/GuidMapper.cs
  3. 2
      src/Squidex.Domain.Apps.Entities/Contents/BackupContents.cs
  4. 2
      src/Squidex.Domain.Apps.Entities/Rules/BackupRules.cs
  5. 2
      tests/Squidex.Domain.Apps.Entities.Tests/Backup/BackupReaderWriterTests.cs
  6. 86
      tests/Squidex.Domain.Apps.Entities.Tests/Backup/GuidMapperTests.cs

2
src/Squidex.Domain.Apps.Entities/Backup/BackupHandlerWithStore.cs

@ -28,7 +28,7 @@ namespace Squidex.Domain.Apps.Entities.Backup
protected Task RemoveSnapshotAsync<TState>(Guid id)
{
return store.RemoveSnapshotAsync<TState>(id);
return store.RemoveSnapshotAsync<Guid, TState>(id);
}
protected async Task RebuildManyAsync(IEnumerable<Guid> ids, Func<Guid, Task> action)

82
src/Squidex.Domain.Apps.Entities/Backup/GuidMapper.cs

@ -0,0 +1,82 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Entities.Backup
{
public static class GuidMapper
{
private static readonly int GuidLength = Guid.Empty.ToString().Length;
public static void GenerateNewGuid(JToken jToken, Dictionary<Guid, Guid> guids)
{
if (jToken.Type == JTokenType.Object)
{
GenerateNewGuid((JObject)jToken, guids);
}
}
private static void GenerateNewGuid(JObject jObject, Dictionary<Guid, Guid> guids)
{
foreach (var kvp in jObject)
{
switch (kvp.Value.Type)
{
case JTokenType.String:
ReplaceGuidString(jObject, guids, kvp);
break;
case JTokenType.Guid:
ReplaceGuid(jObject, guids, kvp);
break;
case JTokenType.Object:
GenerateNewGuid((JObject)kvp.Value, guids);
break;
}
}
}
private static void ReplaceGuidString(JObject jObject, Dictionary<Guid, Guid> guids, KeyValuePair<string, JToken> kvp)
{
var value = kvp.Value.ToString();
if (value.Length == GuidLength)
{
if (Guid.TryParse(value, out var guid))
{
var newGuid = guids.GetOrAdd(guid, GuidGenerator);
jObject.Property(kvp.Key).Value = newGuid.ToString();
}
}
else if (value.Length > GuidLength && value[GuidLength] == ',')
{
if (Guid.TryParse(value.Substring(0, GuidLength), out var guid))
{
var newGuid = guids.GetOrAdd(guid, GuidGenerator);
jObject.Property(kvp.Key).Value = newGuid + value.Substring(GuidLength);
}
}
}
private static void ReplaceGuid(JObject jObject, Dictionary<Guid, Guid> guids, KeyValuePair<string, JToken> kvp)
{
var newGuid = guids.GetOrAdd((Guid)kvp.Value, GuidGenerator);
jObject.Property(kvp.Key).Value = newGuid;
}
private static Guid GuidGenerator(Guid key)
{
return Guid.NewGuid();
}
}
}

2
src/Squidex.Domain.Apps.Entities/Contents/BackupContents.cs

@ -34,7 +34,7 @@ namespace Squidex.Domain.Apps.Entities.Contents
this.contentRepository = contentRepository;
}
public override Task RestoreEventAsync(Envelope<IEvent> @event, Guid appId, BackupReader reader)
public override Task RestoreEventAsync(Envelope<IEvent> @event, Guid appId, BackupReader reader, RefToken actor)
{
switch (@event.Payload)
{

2
src/Squidex.Domain.Apps.Entities/Rules/BackupRules.cs

@ -40,7 +40,7 @@ namespace Squidex.Domain.Apps.Entities.Rules
this.ruleEventRepository = ruleEventRepository;
}
public override Task RestoreEventAsync(Envelope<IEvent> @event, Guid appId, BackupReader reader)
public override Task RestoreEventAsync(Envelope<IEvent> @event, Guid appId, BackupReader reader, RefToken actor)
{
switch (@event.Payload)
{

2
tests/Squidex.Domain.Apps.Entities.Tests/Backup/EventStreamTests.cs → tests/Squidex.Domain.Apps.Entities.Tests/Backup/BackupReaderWriterTests.cs

@ -15,7 +15,7 @@ using Xunit;
namespace Squidex.Domain.Apps.Entities.Backup
{
public class EventStreamTests
public class BackupReaderWriterTests
{
[Fact]
public async Task Should_write_and_read_events()

86
tests/Squidex.Domain.Apps.Entities.Tests/Backup/GuidMapperTests.cs

@ -0,0 +1,86 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Xunit;
namespace Squidex.Domain.Apps.Entities.Backup
{
public class GuidMapperTests
{
[Fact]
public void Should_map_guid()
{
var m = new Dictionary<Guid, Guid>();
var id1 = Guid.NewGuid();
var id2 = Guid.NewGuid();
var obj =
new JObject(
new JProperty("k",
new JObject(
new JProperty("v1", id1),
new JProperty("v2", id1),
new JProperty("v3", id2))));
GuidMapper.GenerateNewGuid(obj, m);
Assert.Equal(m[id1], obj["k"].Value<Guid>("v1"));
Assert.Equal(m[id1], obj["k"].Value<Guid>("v2"));
Assert.Equal(m[id2], obj["k"].Value<Guid>("v3"));
}
[Fact]
public void Should_map_guid_string()
{
var m = new Dictionary<Guid, Guid>();
var id1 = Guid.NewGuid();
var id2 = Guid.NewGuid();
var obj =
new JObject(
new JProperty("k",
new JObject(
new JProperty("v1", id1.ToString()),
new JProperty("v2", id1.ToString()),
new JProperty("v3", id2.ToString()))));
GuidMapper.GenerateNewGuid(obj, m);
Assert.Equal(m[id1].ToString(), obj["k"].Value<string>("v1"));
Assert.Equal(m[id1].ToString(), obj["k"].Value<string>("v2"));
Assert.Equal(m[id2].ToString(), obj["k"].Value<string>("v3"));
}
[Fact]
public void Should_map_named_id()
{
var m = new Dictionary<Guid, Guid>();
var id1 = Guid.NewGuid();
var id2 = Guid.NewGuid();
var obj =
new JObject(
new JProperty("k",
new JObject(
new JProperty("v1", $"{id1},v1"),
new JProperty("v2", $"{id1},v2"),
new JProperty("v3", $"{id2},v3"))));
GuidMapper.GenerateNewGuid(obj, m);
Assert.Equal($"{m[id1].ToString()},v1", obj["k"].Value<string>("v1"));
Assert.Equal($"{m[id1].ToString()},v2", obj["k"].Value<string>("v2"));
Assert.Equal($"{m[id2].ToString()},v3", obj["k"].Value<string>("v3"));
}
}
}
Loading…
Cancel
Save