// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschraenkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using System; using System.Collections.Generic; using System.Threading.Tasks; using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules.EnrichedEvents; using Squidex.Domain.Apps.Events; using Squidex.Infrastructure; using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Core.HandleRules { public abstract class RuleTriggerHandler : IRuleTriggerHandler where TTrigger : RuleTrigger where TEvent : AppEvent where TEnrichedEvent : EnrichedEvent { private readonly List emptyEnrichedEvents = new List(); public Type TriggerType { get => typeof(TTrigger); } public virtual bool CanCreateSnapshotEvents { get => false; } public virtual async IAsyncEnumerable CreateSnapshotEvents(TTrigger trigger, DomainId appId) { await Task.Yield(); yield break; } public virtual async Task> CreateEnrichedEventsAsync(Envelope @event) { var enrichedEvent = await CreateEnrichedEventAsync(@event.To()); if (enrichedEvent != null) { return new List { enrichedEvent }; } else { return emptyEnrichedEvents; } } IAsyncEnumerable IRuleTriggerHandler.CreateSnapshotEvents(RuleTrigger trigger, DomainId appId) { return CreateSnapshotEvents((TTrigger)trigger, appId); } bool IRuleTriggerHandler.Trigger(EnrichedEvent @event, RuleTrigger trigger) { if (@event is TEnrichedEvent typed) { return Trigger(typed, (TTrigger)trigger); } return false; } bool IRuleTriggerHandler.Trigger(AppEvent @event, RuleTrigger trigger, DomainId ruleId) { if (@event is TEvent typed) { return Trigger(typed, (TTrigger)trigger, ruleId); } return false; } protected virtual Task CreateEnrichedEventAsync(Envelope @event) { return Task.FromResult(null); } protected abstract bool Trigger(TEnrichedEvent @event, TTrigger trigger); protected virtual bool Trigger(TEvent @event, TTrigger trigger, DomainId ruleId) { return true; } } }