mirror of https://github.com/Squidex/squidex.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
3.2 KiB
92 lines
3.2 KiB
// ==========================================================================
|
|
// Squidex Headless CMS
|
|
// ==========================================================================
|
|
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
|
// All rights reserved. Licensed under the MIT license.
|
|
// ==========================================================================
|
|
|
|
using System.Runtime.CompilerServices;
|
|
using Squidex.Domain.Apps.Core.HandleRules;
|
|
using Squidex.Domain.Apps.Core.Rules.EnrichedEvents;
|
|
using Squidex.Domain.Apps.Core.Rules.Triggers;
|
|
using Squidex.Domain.Apps.Core.Scripting;
|
|
using Squidex.Domain.Apps.Events;
|
|
using Squidex.Domain.Apps.Events.Schemas;
|
|
using Squidex.Infrastructure.EventSourcing;
|
|
using Squidex.Infrastructure.Reflection;
|
|
|
|
namespace Squidex.Domain.Apps.Entities.Schemas
|
|
{
|
|
public sealed class SchemaChangedTriggerHandler : IRuleTriggerHandler
|
|
{
|
|
private readonly IScriptEngine scriptEngine;
|
|
|
|
public Type TriggerType => typeof(SchemaChangedTrigger);
|
|
|
|
public SchemaChangedTriggerHandler(IScriptEngine scriptEngine)
|
|
{
|
|
this.scriptEngine = scriptEngine;
|
|
}
|
|
|
|
public bool Handles(AppEvent appEvent)
|
|
{
|
|
return appEvent is SchemaEvent;
|
|
}
|
|
|
|
public async IAsyncEnumerable<EnrichedEvent> CreateEnrichedEventsAsync(Envelope<AppEvent> @event, RuleContext context,
|
|
[EnumeratorCancellation] CancellationToken ct)
|
|
{
|
|
var result = new EnrichedSchemaEvent();
|
|
|
|
// Use the concrete event to map properties that are not part of app event.
|
|
SimpleMapper.Map((SchemaEvent)@event.Payload, result);
|
|
|
|
switch (@event.Payload)
|
|
{
|
|
case FieldEvent:
|
|
case SchemaPreviewUrlsConfigured:
|
|
case SchemaScriptsConfigured:
|
|
case SchemaUpdated:
|
|
case ParentFieldEvent:
|
|
result.Type = EnrichedSchemaEventType.Updated;
|
|
break;
|
|
case SchemaCreated:
|
|
result.Type = EnrichedSchemaEventType.Created;
|
|
break;
|
|
case SchemaPublished:
|
|
result.Type = EnrichedSchemaEventType.Published;
|
|
break;
|
|
case SchemaUnpublished:
|
|
result.Type = EnrichedSchemaEventType.Unpublished;
|
|
break;
|
|
case SchemaDeleted:
|
|
result.Type = EnrichedSchemaEventType.Deleted;
|
|
break;
|
|
default:
|
|
yield break;
|
|
}
|
|
|
|
await Task.Yield();
|
|
|
|
yield return result;
|
|
}
|
|
|
|
public bool Trigger(EnrichedEvent @event, RuleContext context)
|
|
{
|
|
var trigger = (SchemaChangedTrigger)context.Rule.Trigger;
|
|
|
|
if (string.IsNullOrWhiteSpace(trigger.Condition))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
// Script vars are just wrappers over dictionaries for better performance.
|
|
var vars = new EventScriptVars
|
|
{
|
|
["event"] = @event
|
|
};
|
|
|
|
return scriptEngine.Evaluate(vars, trigger.Condition);
|
|
}
|
|
}
|
|
}
|
|
|