mirror of https://github.com/Squidex/squidex.git
6 changed files with 172 additions and 4 deletions
@ -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(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -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…
Reference in new issue