// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschränkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules.Triggers; using Squidex.Domain.Apps.Entities.Schemas; using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Entities.Rules.Guards { public sealed class RuleTriggerValidator : IRuleTriggerVisitor>> { public Func> SchemaProvider { get; } public RuleTriggerValidator(Func> schemaProvider) { SchemaProvider = schemaProvider; } public static Task> ValidateAsync(Guid appId, RuleTrigger action, IAppProvider appProvider) { Guard.NotNull(action, nameof(action)); Guard.NotNull(appProvider, nameof(appProvider)); var visitor = new RuleTriggerValidator(x => appProvider.GetSchemaAsync(appId, x)); return action.Accept(visitor); } public Task> Visit(AssetChangedTriggerV2 trigger) { return Task.FromResult(Enumerable.Empty()); } public Task> Visit(SchemaChangedTrigger trigger) { return Task.FromResult(Enumerable.Empty()); } public Task> Visit(UsageTrigger trigger) { var errors = new List(); if (trigger.NumDays.HasValue && (trigger.NumDays < 1 || trigger.NumDays > 30)) { errors.Add(new ValidationError(Not.Between("Num days", 1, 30), nameof(trigger.NumDays))); } return Task.FromResult>(errors); } public async Task> Visit(ContentChangedTriggerV2 trigger) { var errors = new List(); if (trigger.Schemas != null) { var tasks = new List>(); foreach (var schema in trigger.Schemas) { if (schema.SchemaId == Guid.Empty) { errors.Add(new ValidationError(Not.Defined("Schema id"), nameof(trigger.Schemas))); } else { tasks.Add(CheckSchemaAsync(schema)); } } var checkErrors = await Task.WhenAll(tasks); errors.AddRange(checkErrors.Where(x => x != null)); } return errors; } private async Task CheckSchemaAsync(ContentChangedTriggerSchemaV2 schema) { if (await SchemaProvider(schema.SchemaId) == null) { return new ValidationError($"Schema {schema.SchemaId} does not exist.", nameof(ContentChangedTriggerV2.Schemas)); } return null; } } }