diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/DefaultAppImageStore.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/DefaultAppImageStore.cs index 55b09e076..2feb0a766 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/DefaultAppImageStore.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/DefaultAppImageStore.cs @@ -20,7 +20,7 @@ namespace Squidex.Domain.Apps.Entities.Apps public DefaultAppImageStore(IAssetStore assetStore) { - Guard.NotNull(assetStore, nameof(assetStore)); + Guard.NotNull(assetStore); this.assetStore = assetStore; } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Backup/DefaultBackupArchiveStore.cs b/backend/src/Squidex.Domain.Apps.Entities/Backup/DefaultBackupArchiveStore.cs index 9a03e48a7..301dfa7c2 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Backup/DefaultBackupArchiveStore.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Backup/DefaultBackupArchiveStore.cs @@ -20,7 +20,7 @@ namespace Squidex.Domain.Apps.Entities.Backup public DefaultBackupArchiveStore(IAssetStore assetStore) { - Guard.NotNull(assetStore, nameof(assetStore)); + Guard.NotNull(assetStore); this.assetStore = assetStore; } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ScriptContent.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ScriptContent.cs index 721e9f7d0..7e954d258 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ScriptContent.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ScriptContent.cs @@ -19,7 +19,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries.Steps public ScriptContent(IScriptEngine scriptEngine) { - Guard.NotNull(scriptEngine, nameof(scriptEngine)); + Guard.NotNull(scriptEngine); this.scriptEngine = scriptEngine; } diff --git a/backend/src/Squidex.Domain.Apps.Entities/EventStoreInitializer.cs b/backend/src/Squidex.Domain.Apps.Entities/EventStoreInitializer.cs new file mode 100644 index 000000000..83d513a9f --- /dev/null +++ b/backend/src/Squidex.Domain.Apps.Entities/EventStoreInitializer.cs @@ -0,0 +1,34 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.Threading; +using System.Threading.Tasks; +using Squidex.Domain.Apps.Events; +using Squidex.Infrastructure; +using Squidex.Infrastructure.EventSourcing; + +namespace Squidex.Domain.Apps.Entities +{ + public sealed class EventStoreInitializer : IInitializable + { + private readonly IEventStore eventStore; + + public int Order => 1000; + + public EventStoreInitializer(IEventStore eventStore) + { + Guard.NotNull(eventStore); + + this.eventStore = eventStore; + } + + public Task InitializeAsync(CancellationToken ct = default) + { + return eventStore.CreateIndexAsync(SquidexHeaders.AppId); + } + } +} diff --git a/backend/src/Squidex.Domain.Apps.Entities/Rules/Runner/GrainRuleRunnerService.cs b/backend/src/Squidex.Domain.Apps.Entities/Rules/Runner/GrainRuleRunnerService.cs index 4262ad8cb..10dfd6b36 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Rules/Runner/GrainRuleRunnerService.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Rules/Runner/GrainRuleRunnerService.cs @@ -18,7 +18,7 @@ namespace Squidex.Domain.Apps.Entities.Rules.Runner public GrainRuleRunnerService(IGrainFactory grainFactory) { - Guard.NotNull(grainFactory, nameof(grainFactory)); + Guard.NotNull(grainFactory); this.grainFactory = grainFactory; } diff --git a/backend/src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEventStore_Reader.cs b/backend/src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEventStore_Reader.cs index 726f4d568..bca3488c1 100644 --- a/backend/src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEventStore_Reader.cs +++ b/backend/src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEventStore_Reader.cs @@ -30,7 +30,9 @@ namespace Squidex.Infrastructure.EventSourcing return Collection.Indexes.CreateOneAsync( new CreateIndexModel( - Index.Ascending(CreateIndexPath(property)))); + Index + .Ascending(CreateIndexPath(property)) + .Ascending(TimestampField))); } public IEventSubscription CreateSubscription(IEventSubscriber subscriber, string? streamFilter = null, string? position = null) diff --git a/backend/src/Squidex.Infrastructure/IInitializable.cs b/backend/src/Squidex.Infrastructure/IInitializable.cs index bbae7e8a8..621076be5 100644 --- a/backend/src/Squidex.Infrastructure/IInitializable.cs +++ b/backend/src/Squidex.Infrastructure/IInitializable.cs @@ -12,6 +12,8 @@ namespace Squidex.Infrastructure { public interface IInitializable { + int Order => 0; + Task InitializeAsync(CancellationToken ct = default); } } diff --git a/backend/src/Squidex/Config/Domain/BackupsServices.cs b/backend/src/Squidex/Config/Domain/BackupsServices.cs index 31b650c2c..1c8e3b32e 100644 --- a/backend/src/Squidex/Config/Domain/BackupsServices.cs +++ b/backend/src/Squidex/Config/Domain/BackupsServices.cs @@ -6,6 +6,7 @@ // ========================================================================== using Microsoft.Extensions.DependencyInjection; +using Squidex.Domain.Apps.Entities; using Squidex.Domain.Apps.Entities.Apps; using Squidex.Domain.Apps.Entities.Assets; using Squidex.Domain.Apps.Entities.Backup; @@ -42,6 +43,9 @@ namespace Squidex.Config.Domain services.AddTransientAs() .As(); + + services.AddSingletonAs() + .AsSelf(); } } } \ No newline at end of file diff --git a/backend/src/Squidex/Config/Startup/InitializerHost.cs b/backend/src/Squidex/Config/Startup/InitializerHost.cs index 812fd0f19..507b58979 100644 --- a/backend/src/Squidex/Config/Startup/InitializerHost.cs +++ b/backend/src/Squidex/Config/Startup/InitializerHost.cs @@ -26,7 +26,7 @@ namespace Squidex.Config.Startup protected override async Task StartAsync(ISemanticLog log, CancellationToken ct) { - foreach (var target in targets.Distinct()) + foreach (var target in targets.Distinct().OrderBy(x => x.Order)) { await target.InitializeAsync(ct);