// ========================================================================== // 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.Schemas; using Squidex.Infrastructure; using Squidex.Infrastructure.Json.Objects; namespace Squidex.Domain.Apps.Core.ExtractReferenceIds { public sealed class ReferencesCleaner : IFieldVisitor { private readonly HashSet validIds; private IJsonValue value; public ReferencesCleaner(HashSet validIds) { Guard.NotNull(validIds); this.validIds = validIds; } public void SetValue(IJsonValue newValue) { value = newValue; } public IJsonValue Visit(IField field) { return CleanIds(); } public IJsonValue Visit(IField field) { return CleanIds(); } public IJsonValue Visit(IField field) { return value; } public IJsonValue Visit(IField field) { return value; } public IJsonValue Visit(IField field) { return value; } public IJsonValue Visit(IField field) { return value; } public IJsonValue Visit(IField field) { return value; } public IJsonValue Visit(IField field) { return value; } public IJsonValue Visit(IField field) { return value; } public IJsonValue Visit(IField field) { return value; } public IJsonValue Visit(IArrayField field) { return value; } private IJsonValue CleanIds() { if (value is JsonArray array) { var result = new JsonArray(array); for (var i = 0; i < result.Count; i++) { if (!IsValidReference(result[i])) { result.RemoveAt(i); i--; } } return result; } return value; } private bool IsValidReference(IJsonValue item) { return item is JsonString s && Guid.TryParse(s.Value, out var guid) && validIds.Contains(guid); } } }