From 6d0d71347196d86afed8309bc0327944c58036c8 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Sat, 7 Dec 2024 19:20:36 +0100 Subject: [PATCH] Fixes (#1148) * Small fix for parent ID * Get rid of unnecessary step. --- .github/workflows/dev.yml | 7 ------- .../Rules/EnrichedEvents/EnrichedAssetEvent.cs | 2 +- .../HandleRules/RuleService.cs | 6 +++--- .../HandleRules/{RuleOptions.cs => RulesOptions.cs} | 4 +++- .../Rules/RuleDequeuerWorker.cs | 6 +++++- .../Squidex.Domain.Apps.Entities/Rules/RuleEnqueuer.cs | 2 +- .../Rules/Runner/DefaultRuleRunnerService.cs | 2 +- backend/src/Squidex/Config/Domain/RuleServices.cs | 2 +- backend/src/Squidex/appsettings.json | 5 ++++- .../Operations/HandleRules/RuleServiceTests.cs | 3 ++- .../Rules/RuleDequeuerWorkerTests.cs | 8 +++++++- .../Rules/RuleEnqueuerTests.cs | 2 +- 12 files changed, 29 insertions(+), 20 deletions(-) rename backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/{RuleOptions.cs => RulesOptions.cs} (84%) diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index 2c0fe303f..6d558b04f 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -108,13 +108,6 @@ jobs: path: tools/e2e/playwright-report/ retention-days: 30 - - name: Test - Upload Screenshots - if: failure() - uses: actions/upload-artifact@v4.4.3 - with: - path: | - tools/TestSuite/TestSuite.ApiTests/bin/Debug/net8.0/screenshots/ - - name: Test - Dump docker logs on failure if: failure() uses: jwalton/gh-docker-logs@v2.2.2 diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Rules/EnrichedEvents/EnrichedAssetEvent.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Rules/EnrichedEvents/EnrichedAssetEvent.cs index 311578d08..a2a89709e 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Rules/EnrichedEvents/EnrichedAssetEvent.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Rules/EnrichedEvents/EnrichedAssetEvent.cs @@ -32,7 +32,7 @@ public sealed class EnrichedAssetEvent : EnrichedUserEventBase, IEnrichedEntityE public RefToken LastModifiedBy { get; set; } [FieldDescription(nameof(FieldDescriptions.AssetParentId))] - public DomainId ParentId { get; } + public DomainId ParentId { get; set; } [FieldDescription(nameof(FieldDescriptions.AssetMimeType))] public string MimeType { get; set; } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs index 8d4ab6316..bada0828e 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs @@ -23,7 +23,7 @@ using Squidex.Infrastructure.Tasks; namespace Squidex.Domain.Apps.Core.HandleRules; public sealed class RuleService( - IOptions ruleOptions, + IOptions options, IEnumerable ruleTriggerHandlers, IEnumerable ruleActionHandlers, IEventEnricher eventEnricher, @@ -34,7 +34,7 @@ public sealed class RuleService( { private readonly Dictionary ruleActionHandlers = ruleActionHandlers.ToDictionary(x => x.ActionType); private readonly Dictionary ruleTriggerHandlers = ruleTriggerHandlers.ToDictionary(x => x.TriggerType); - private readonly RuleOptions ruleOptions = ruleOptions.Value; + private readonly RulesOptions options = options.Value; private sealed class RuleState { @@ -451,6 +451,6 @@ public sealed class RuleService( private int GetTimeoutInMs() { - return ruleOptions.ExecutionTimeoutInSeconds * 1000; + return options.ExecutionTimeoutInSeconds * 1000; } } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleOptions.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RulesOptions.cs similarity index 84% rename from backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleOptions.cs rename to backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RulesOptions.cs index 31294ee63..41ebf24fc 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleOptions.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RulesOptions.cs @@ -7,11 +7,13 @@ namespace Squidex.Domain.Apps.Core.HandleRules; -public sealed class RuleOptions +public sealed class RulesOptions { public int ExecutionTimeoutInSeconds { get; set; } = 3; public int MaxEnrichedEvents { get; set; } = 500; + public TimeSpan JobQueryInterval { get; set; } = TimeSpan.FromSeconds(10); + public TimeSpan RulesCacheDuration { get; set; } = TimeSpan.FromSeconds(10); } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Rules/RuleDequeuerWorker.cs b/backend/src/Squidex.Domain.Apps.Entities/Rules/RuleDequeuerWorker.cs index 3a81881d3..4a2eeaeca 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Rules/RuleDequeuerWorker.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Rules/RuleDequeuerWorker.cs @@ -7,6 +7,7 @@ using System.Collections.Concurrent; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using NodaTime; using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.Rules; @@ -22,6 +23,7 @@ public sealed class RuleDequeuerWorker : IBackgroundProcess { private readonly ConcurrentDictionary executing = new ConcurrentDictionary(); private readonly PartitionedScheduler requestScheduler; + private readonly RulesOptions options; private readonly IRuleEventRepository ruleEventRepository; private readonly IRuleService ruleService; private readonly IRuleUsageTracker ruleUsageTracker; @@ -34,11 +36,13 @@ public sealed class RuleDequeuerWorker : IBackgroundProcess IRuleService ruleService, IRuleUsageTracker ruleUsageTracker, IRuleEventRepository ruleEventRepository, + IOptions options, ILogger log) { this.ruleEventRepository = ruleEventRepository; this.ruleService = ruleService; this.ruleUsageTracker = ruleUsageTracker; + this.options = options.Value; this.log = log; requestScheduler = new PartitionedScheduler(HandleAsync, 32, 2); @@ -47,7 +51,7 @@ public sealed class RuleDequeuerWorker : IBackgroundProcess public Task StartAsync( CancellationToken ct) { - timer = new CompletionTimer((int)TimeSpan.FromSeconds(10).TotalMilliseconds, QueryAsync); + timer = new CompletionTimer((int)options.JobQueryInterval.TotalMilliseconds, QueryAsync); return Task.CompletedTask; } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Rules/RuleEnqueuer.cs b/backend/src/Squidex.Domain.Apps.Entities/Rules/RuleEnqueuer.cs index dea4d22ec..c7b305bb9 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Rules/RuleEnqueuer.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Rules/RuleEnqueuer.cs @@ -26,7 +26,7 @@ public sealed class RuleEnqueuer( IRuleEventRepository ruleEventRepository, IRuleService ruleService, IRuleUsageTracker ruleUsageTracker, - IOptions options, + IOptions options, ILogger log) : IEventConsumer, IRuleEnqueuer { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Rules/Runner/DefaultRuleRunnerService.cs b/backend/src/Squidex.Domain.Apps.Entities/Rules/Runner/DefaultRuleRunnerService.cs index 93ec8f3fc..0d2ed42e0 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Rules/Runner/DefaultRuleRunnerService.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Rules/Runner/DefaultRuleRunnerService.cs @@ -63,7 +63,7 @@ public sealed class DefaultRuleRunnerService( continue; } - // Also create jobs for rules with failing conditions because we want to show them in th table. + // Also create jobs for rules with failing conditions because we want to show them in the table. await foreach (var job in ruleService.CreateJobsAsync(@event, context, ct).Take(MaxSimulatedEvents).WithCancellation(ct)) { var eventName = job.Job?.EventName; diff --git a/backend/src/Squidex/Config/Domain/RuleServices.cs b/backend/src/Squidex/Config/Domain/RuleServices.cs index dea4f4c71..a726a04b5 100644 --- a/backend/src/Squidex/Config/Domain/RuleServices.cs +++ b/backend/src/Squidex/Config/Domain/RuleServices.cs @@ -29,7 +29,7 @@ public static class RuleServices { public static void AddSquidexRules(this IServiceCollection services, IConfiguration config) { - services.Configure(config, + services.Configure(config, "rules"); services.AddSingletonAs() diff --git a/backend/src/Squidex/appsettings.json b/backend/src/Squidex/appsettings.json index 3c07bb93d..e3002de92 100644 --- a/backend/src/Squidex/appsettings.json +++ b/backend/src/Squidex/appsettings.json @@ -121,7 +121,10 @@ "executionTimeoutInSeconds": 10, // The cache duration for rules. - "rulesCacheDuration": "00:00:10" + "rulesCacheDuration": "00:00:10", + + // How often the rule jobs are queried for updated. Must be greater than zero. + "jobQueryInterval": "00:00:10" }, "ui": { diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleServiceTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleServiceTests.cs index b00511036..ff101342e 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleServiceTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleServiceTests.cs @@ -80,7 +80,8 @@ public class RuleServiceTests var log = A.Fake>(); - sut = new RuleService(Options.Create(new RuleOptions()), + sut = new RuleService( + Options.Create(new RulesOptions()), [ruleTriggerHandler], [ruleActionHandler], eventEnricher, TestUtils.DefaultSerializer, log, typeRegistry) diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Rules/RuleDequeuerWorkerTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Rules/RuleDequeuerWorkerTests.cs index 4ce85534c..e4d56fa6f 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Rules/RuleDequeuerWorkerTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Rules/RuleDequeuerWorkerTests.cs @@ -6,6 +6,7 @@ // ========================================================================== using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using NodaTime; using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.Rules; @@ -28,7 +29,12 @@ public class RuleDequeuerWorkerTests A.CallTo(() => clock.GetCurrentInstant()) .Returns(SystemClock.Instance.GetCurrentInstant().WithoutMs()); - sut = new RuleDequeuerWorker(ruleService, ruleUsageTracker, ruleEventRepository, log) + sut = new RuleDequeuerWorker( + ruleService, + ruleUsageTracker, + ruleEventRepository, + Options.Create(new RulesOptions()), + log) { Clock = clock }; diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Rules/RuleEnqueuerTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Rules/RuleEnqueuerTests.cs index fa49a22c5..a2d3aa3df 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Rules/RuleEnqueuerTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Rules/RuleEnqueuerTests.cs @@ -37,7 +37,7 @@ public class RuleEnqueuerTests : GivenContext public RuleEnqueuerTests() { - var options = Options.Create(new RuleOptions()); + var options = Options.Create(new RulesOptions()); sut = new RuleEnqueuer(cache, A.Fake(), AppProvider,