// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschraenkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Core.ValidateContent; using Squidex.Infrastructure; using Squidex.Infrastructure.Json; using Squidex.Infrastructure.Json.Objects; #pragma warning disable MA0048 // File name must match type name namespace Squidex.Domain.Apps.Core.ConvertContent { public delegate JsonValue? ValueConverter(JsonValue value, IField field, IArrayField? parent); public static class ValueConverters { public static readonly ValueConverter Noop = (value, field, parent) => value; public static readonly ValueConverter ExcludeHidden = (value, field, parent) => { return field.IsForApi() ? (JsonValue?)value : null; }; public static ValueConverter ExcludeChangedTypes(IJsonSerializer jsonSerializer) { return (value, field, parent) => { if (value == default) { return value; } try { if (!JsonValueValidator.IsValid(field, value, jsonSerializer)) { return null; } } catch { return null; } return value; }; } public static ValueConverter ResolveAssetUrls(NamedId appId, IReadOnlyCollection? fields, IUrlGenerator urlGenerator) { if (fields?.Any() != true) { return Noop; } Func shouldHandle; if (fields.Contains("*")) { shouldHandle = (field, parent) => true; } else { var paths = fields.Select(x => x.Split('.')).ToList(); shouldHandle = (field, parent) => { for (var i = 0; i < paths.Count; i++) { var path = paths[i]; if (parent != null) { if (path.Length == 2 && path[0] == parent.Name && path[1] == field.Name) { return true; } } else { if (path.Length == 1 && path[0] == field.Name) { return true; } } } return false; }; } return (value, field, parent) => { if (field is IField && value.Value is JsonArray a && shouldHandle(field, parent)) { for (var i = 0; i < a.Count; i++) { a[i] = urlGenerator.AssetContent(appId, a[i].ToString()); } } return value; }; } } }