// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschraenkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using System.Collections.Generic; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Infrastructure; using Squidex.Infrastructure.Json.Objects; namespace Squidex.Domain.Apps.Core.ExtractReferenceIds { internal sealed class ReferencesCleaner : IFieldVisitor { private static readonly ReferencesCleaner Instance = new ReferencesCleaner(); public readonly struct Args { public readonly IJsonValue Value; public readonly HashSet ValidIds; public Args(IJsonValue value, HashSet validIds) { Value = value; ValidIds = validIds; } } private ReferencesCleaner() { } public static IJsonValue Cleanup(IField field, IJsonValue? value, HashSet validIds) { var args = new Args(value ?? JsonValue.Null, validIds); return field.Accept(Instance, args); } public IJsonValue Visit(IField field, Args args) { return CleanIds(args); } public IJsonValue Visit(IField field, Args args) { return CleanIds(args); } public IJsonValue Visit(IField field, Args args) { return args.Value; } public IJsonValue Visit(IField field, Args args) { return args.Value; } public IJsonValue Visit(IField field, Args args) { return args.Value; } public IJsonValue Visit(IField field, Args args) { return args.Value; } public IJsonValue Visit(IField field, Args args) { return args.Value; } public IJsonValue Visit(IField field, Args args) { return args.Value; } public IJsonValue Visit(IField field, Args args) { return args.Value; } public IJsonValue Visit(IField field, Args args) { return args.Value; } public IJsonValue Visit(IField field, Args args) { return args.Value; } public IJsonValue Visit(IField field, Args args) { return args.Value; } public IJsonValue Visit(IArrayField field, Args args) { return args.Value; } private static IJsonValue CleanIds(Args args) { if (args.Value is JsonArray array) { var result = array; for (var i = 0; i < result.Count; i++) { if (!IsValidReference(result[i], args)) { if (ReferenceEquals(result, array)) { result = new JsonArray(array); } result.RemoveAt(i); i--; } } return result; } return args.Value; } private static bool IsValidReference(IJsonValue item, Args args) { return item is JsonString s && args.ValidIds.Contains(DomainId.Create(s.Value)); } } }