diff --git a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventConsumerInfoRepository.cs b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventConsumerInfoRepository.cs index 38e1ab3c0..306e1b736 100644 --- a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventConsumerInfoRepository.cs +++ b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventConsumerInfoRepository.cs @@ -65,6 +65,11 @@ namespace Squidex.Infrastructure.CQRS.Events } } + public Task ClearAsync(IEnumerable currentConsumerNames) + { + return Collection.DeleteManyAsync(Filter.Not(Filter.In(NameField, currentConsumerNames))); + } + public Task StartAsync(string consumerName) { var filter = Filter.Eq(NameField, consumerName); diff --git a/src/Squidex.Infrastructure/CQRS/Events/EventConsumerCleaner.cs b/src/Squidex.Infrastructure/CQRS/Events/EventConsumerCleaner.cs new file mode 100644 index 000000000..c51c7b043 --- /dev/null +++ b/src/Squidex.Infrastructure/CQRS/Events/EventConsumerCleaner.cs @@ -0,0 +1,36 @@ +// ========================================================================== +// EventConsumerCleaner.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Squidex.Infrastructure.CQRS.Events +{ + public sealed class EventConsumerCleaner + { + private readonly IEnumerable eventConsumers; + private readonly IEventConsumerInfoRepository eventConsumerInfoRepository; + + public EventConsumerCleaner(IEnumerable eventConsumers, IEventConsumerInfoRepository eventConsumerInfoRepository) + { + Guard.NotNull(eventConsumers, nameof(eventConsumers)); + Guard.NotNull(eventConsumerInfoRepository, nameof(eventConsumerInfoRepository)); + + this.eventConsumers = eventConsumers; + this.eventConsumerInfoRepository = eventConsumerInfoRepository; + } + + public Task CleanAsync() + { + var names = eventConsumers.Select(x => x.Name).ToArray(); + + return eventConsumerInfoRepository.ClearAsync(names); + } + } +} \ No newline at end of file diff --git a/src/Squidex.Infrastructure/CQRS/Events/IEventConsumerInfoRepository.cs b/src/Squidex.Infrastructure/CQRS/Events/IEventConsumerInfoRepository.cs index bc4b2b49d..1cc02b0f9 100644 --- a/src/Squidex.Infrastructure/CQRS/Events/IEventConsumerInfoRepository.cs +++ b/src/Squidex.Infrastructure/CQRS/Events/IEventConsumerInfoRepository.cs @@ -17,6 +17,8 @@ namespace Squidex.Infrastructure.CQRS.Events Task FindAsync(string consumerName); + Task ClearAsync(IEnumerable currentConsumerNames); + Task CreateAsync(string consumerName); Task StartAsync(string consumerName); diff --git a/src/Squidex/Config/Domain/InfrastructureModule.cs b/src/Squidex/Config/Domain/InfrastructureModule.cs index 3da7630f1..464e202a2 100644 --- a/src/Squidex/Config/Domain/InfrastructureModule.cs +++ b/src/Squidex/Config/Domain/InfrastructureModule.cs @@ -131,6 +131,10 @@ namespace Squidex.Config.Domain .As() .SingleInstance(); + builder.RegisterType() + .AsSelf() + .SingleInstance(); + builder.RegisterType() .AsSelf() .SingleInstance(); diff --git a/src/Squidex/Config/Domain/Usages.cs b/src/Squidex/Config/Domain/Usages.cs index 150a03410..2fad3865a 100644 --- a/src/Squidex/Config/Domain/Usages.cs +++ b/src/Squidex/Config/Domain/Usages.cs @@ -18,6 +18,8 @@ namespace Squidex.Config.Domain { public static IApplicationBuilder UseMyEventStore(this IApplicationBuilder app) { + app.ApplicationServices.GetService().CleanAsync().Wait(); + var catchConsumers = app.ApplicationServices.GetServices(); foreach (var catchConsumer in catchConsumers) diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Events/EventConsumerCleanerTests.cs b/tests/Squidex.Infrastructure.Tests/CQRS/Events/EventConsumerCleanerTests.cs new file mode 100644 index 000000000..ea60aa0e7 --- /dev/null +++ b/tests/Squidex.Infrastructure.Tests/CQRS/Events/EventConsumerCleanerTests.cs @@ -0,0 +1,36 @@ +// ========================================================================== +// EventConsumerCleanerTests.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System.Collections.Generic; +using System.Threading.Tasks; +using FakeItEasy; +using Xunit; + +namespace Squidex.Infrastructure.CQRS.Events +{ + public class EventConsumerCleanerTests + { + [Fact] + public async Task Should_call_repository_with_all_names() + { + var eventConsumer1 = A.Fake(); + var eventConsumer2 = A.Fake(); + + A.CallTo(() => eventConsumer1.Name).Returns("consumer1"); + A.CallTo(() => eventConsumer2.Name).Returns("consumer2"); + + var repository = A.Fake(); + + var sut = new EventConsumerCleaner(new[] { eventConsumer1, eventConsumer2 }, repository); + + await sut.CleanAsync(); + + A.CallTo(() => repository.ClearAsync(A>.That.IsSameSequenceAs(new string[] { "consumer1", "consumer2" }))).MustHaveHappened(); + } + } +}