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