diff --git a/src/Squidex.Domain.Apps.Core.Model/Rules/Json/JsonRule.cs b/src/Squidex.Domain.Apps.Core.Model/Rules/Json/JsonRule.cs new file mode 100644 index 000000000..163a66661 --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Model/Rules/Json/JsonRule.cs @@ -0,0 +1,46 @@ +// ========================================================================== +// JsonRule.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using Newtonsoft.Json; +using Squidex.Infrastructure.Reflection; + +namespace Squidex.Domain.Apps.Core.Rules.Json +{ + public sealed class JsonRule + { + [JsonProperty] + public RuleTrigger Trigger { get; set; } + + [JsonProperty] + public RuleAction Action { get; set; } + + [JsonProperty] + public bool IsEnabled { get; set; } + + public JsonRule() + { + } + + public JsonRule(Rule rule) + { + SimpleMapper.Map(rule, this); + } + + public Rule ToRule() + { + var rule = new Rule(Trigger, Action); + + if (!IsEnabled) + { + rule.Disable(); + } + + return rule; + } + } +} diff --git a/src/Squidex.Domain.Apps.Core.Model/Rules/Json/RuleConverter.cs b/src/Squidex.Domain.Apps.Core.Model/Rules/Json/RuleConverter.cs new file mode 100644 index 000000000..27f7f10c5 --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Model/Rules/Json/RuleConverter.cs @@ -0,0 +1,27 @@ +// ========================================================================== +// RuleConverter.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using Newtonsoft.Json; +using Squidex.Infrastructure.Json; + +namespace Squidex.Domain.Apps.Core.Rules.Json +{ + public sealed class RuleConverter : JsonClassConverter + { + protected override Rule ReadValue(JsonReader reader, JsonSerializer serializer) + { + return serializer.Deserialize(reader).ToRule(); + } + + protected override void WriteValue(JsonWriter writer, Rule value, JsonSerializer serializer) + { + serializer.Serialize(writer, new JsonRule(value)); + } + } +} diff --git a/src/Squidex.Domain.Apps.Core.Model/Rules/Rule.cs b/src/Squidex.Domain.Apps.Core.Model/Rules/Rule.cs index 877ab8885..8595d84a8 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Rules/Rule.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Rules/Rule.cs @@ -67,7 +67,7 @@ namespace Squidex.Domain.Apps.Core.Rules { Guard.NotNull(newAction, nameof(newAction)); - if (newAction.GetType() != trigger.GetType()) + if (newAction.GetType() != action.GetType()) { throw new ArgumentException("New action has another type.", nameof(newAction)); } diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs index 632f05d72..3d236b815 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs @@ -100,7 +100,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules return job; } - public async Task<(string Dump, RuleResult Result, TimeSpan Elapsed)> InvokeAsync(string actionName, Dictionary job) + public async Task<(string Dump, RuleResult Result, TimeSpan Elapsed)> InvokeAsync(string actionName, RuleJobData job) { try { diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Model/Rules/RuleTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Model/Rules/RuleTests.cs new file mode 100644 index 000000000..1d83454fc --- /dev/null +++ b/tests/Squidex.Domain.Apps.Core.Tests/Model/Rules/RuleTests.cs @@ -0,0 +1,113 @@ +// ========================================================================== +// RuleTests.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using FluentAssertions; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Squidex.Domain.Apps.Core.Rules; +using Squidex.Domain.Apps.Core.Rules.Actions; +using Squidex.Domain.Apps.Core.Rules.Triggers; +using Xunit; + +namespace Squidex.Domain.Apps.Core.Model.Rules +{ + public class RuleTests + { + private readonly JsonSerializer serializer = TestData.DefaultSerializer(); + private readonly Rule sut = new Rule(new ContentChangedTrigger(), new WebhookAction()); + + public sealed class OtherTrigger : RuleTrigger + { + public override T Accept(IRuleTriggerVisitor visitor) + { + throw new NotSupportedException(); + } + } + + public sealed class OtherAction : RuleAction + { + public override T Accept(IRuleActionVisitor visitor) + { + throw new NotSupportedException(); + } + } + + [Fact] + public void Should_create_with_trigger_and_action() + { + var ruleTrigger = new ContentChangedTrigger(); + var ruleAction = new WebhookAction(); + + var newRule = new Rule(ruleTrigger, ruleAction); + + Assert.Equal(ruleTrigger, newRule.Trigger); + Assert.Equal(ruleAction, newRule.Action); + Assert.True(newRule.IsEnabled); + } + + [Fact] + public void Should_set_enabled_to_true_when_enabling() + { + sut.Enable(); + + Assert.True(sut.IsEnabled); + } + + [Fact] + public void Should_set_enabled_to_false_when_disabling() + { + sut.Enable(); + sut.Disable(); + + Assert.False(sut.IsEnabled); + } + + [Fact] + public void Should_replace_trigger_when_updating() + { + var newTrigger = new ContentChangedTrigger(); + + sut.Update(newTrigger); + + Assert.Same(newTrigger, sut.Trigger); + } + + [Fact] + public void Should_throw_exception_when_new_trigger_has_other_type() + { + Assert.Throws(() => sut.Update(new OtherTrigger())); + } + + [Fact] + public void Should_replace_action_when_updating() + { + var newAction = new WebhookAction(); + + sut.Update(newAction); + + Assert.Same(newAction, sut.Action); + } + + [Fact] + public void Should_throw_exception_when_new_action_has_other_type() + { + Assert.Throws(() => sut.Update(new OtherAction())); + } + + [Fact] + public void Should_serialize_and_deserialize() + { + sut.Disable(); + + var appClients = JToken.FromObject(sut, serializer).ToObject(serializer); + + appClients.ShouldBeEquivalentTo(sut); + } + } +} diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj b/tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj index 6314f5295..db37388f0 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj +++ b/tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj @@ -19,10 +19,7 @@ - - - - + ..\..\Squidex.ruleset diff --git a/tests/Squidex.Domain.Apps.Core.Tests/TestData.cs b/tests/Squidex.Domain.Apps.Core.Tests/TestData.cs index 15b4449a0..ad21aafa0 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/TestData.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/TestData.cs @@ -9,6 +9,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Squidex.Domain.Apps.Core.Apps.Json; +using Squidex.Domain.Apps.Core.Rules.Json; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Core.Schemas.Json; using Squidex.Infrastructure; @@ -36,6 +37,7 @@ namespace Squidex.Domain.Apps.Core new NamedLongIdConverter(), new NamedStringIdConverter(), new RefTokenConverter(), + new RuleConverter(), new SchemaConverter(new FieldRegistry(typeNameRegistry)), new StringEnumConverter()), diff --git a/tests/Squidex.Domain.Apps.Read.Tests/Squidex.Domain.Apps.Read.Tests.csproj b/tests/Squidex.Domain.Apps.Read.Tests/Squidex.Domain.Apps.Read.Tests.csproj index 48bba6f42..06b97a592 100644 --- a/tests/Squidex.Domain.Apps.Read.Tests/Squidex.Domain.Apps.Read.Tests.csproj +++ b/tests/Squidex.Domain.Apps.Read.Tests/Squidex.Domain.Apps.Read.Tests.csproj @@ -29,10 +29,7 @@ - - - - + ..\..\Squidex.ruleset diff --git a/tests/Squidex.Domain.Apps.Write.Tests/Squidex.Domain.Apps.Write.Tests.csproj b/tests/Squidex.Domain.Apps.Write.Tests/Squidex.Domain.Apps.Write.Tests.csproj index b049b5e7c..ddbddff8e 100644 --- a/tests/Squidex.Domain.Apps.Write.Tests/Squidex.Domain.Apps.Write.Tests.csproj +++ b/tests/Squidex.Domain.Apps.Write.Tests/Squidex.Domain.Apps.Write.Tests.csproj @@ -21,10 +21,7 @@ - - - - + ..\..\Squidex.ruleset diff --git a/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj b/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj index f54f04636..41bc3752e 100644 --- a/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj +++ b/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj @@ -21,10 +21,7 @@ - - - - + ..\..\Squidex.ruleset diff --git a/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj b/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj index feee70e93..1ae104ea4 100644 --- a/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj +++ b/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj @@ -24,10 +24,7 @@ - - - - + ..\..\Squidex.ruleset