// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschränkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using System; using System.Collections.Generic; using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.ConvertContent { public static class ContentConverter { private static readonly Func KeyNameResolver = f => f.Name; private static readonly Func KeyIdResolver = f => f.Id; public static NamedContentData ConvertId2Name(this IdContentData content, Schema schema, params FieldConverter[] converters) { Guard.NotNull(schema); var result = new NamedContentData(content.Count); return ConvertInternal(content, result, schema.FieldsById, KeyNameResolver, converters); } public static IdContentData ConvertId2Id(this IdContentData content, Schema schema, params FieldConverter[] converters) { Guard.NotNull(schema); var result = new IdContentData(content.Count); return ConvertInternal(content, result, schema.FieldsById, KeyIdResolver, converters); } public static NamedContentData ConvertName2Name(this NamedContentData content, Schema schema, params FieldConverter[] converters) { Guard.NotNull(schema); var result = new NamedContentData(content.Count); return ConvertInternal(content, result, schema.FieldsByName, KeyNameResolver, converters); } public static IdContentData ConvertName2Id(this NamedContentData content, Schema schema, params FieldConverter[] converters) { Guard.NotNull(schema); var result = new IdContentData(content.Count); return ConvertInternal(content, result, schema.FieldsByName, KeyIdResolver, converters); } private static TDict2 ConvertInternal( TDict1 source, TDict2 target, IReadOnlyDictionary fields, Func targetKey, params FieldConverter[] converters) where TDict1 : IDictionary where TDict2 : IDictionary where TKey1 : notnull where TKey2 : notnull { foreach (var (fieldName, value) in source) { if (!fields.TryGetValue(fieldName, out var field)) { continue; } var newValue = value; if (newValue != null) { if (converters != null) { foreach (var converter in converters) { newValue = converter(newValue, field); if (newValue == null) { break; } } } } if (newValue != null) { target.Add(targetKey(field), newValue); } } return target; } } }