diff --git a/src/Squidex.Domain.Apps.Read/State/AppProvider.cs b/src/Squidex.Domain.Apps.Read/State/AppProvider.cs index d5e59c937..75e6754ff 100644 --- a/src/Squidex.Domain.Apps.Read/State/AppProvider.cs +++ b/src/Squidex.Domain.Apps.Read/State/AppProvider.cs @@ -77,13 +77,11 @@ namespace Squidex.Domain.Apps.Read.State var appUser = await factory.GetAsync(userId); var appNames = await appUser.GetAppNamesAsync(); - var tasks = - appNames - .Select(x => GetAppAsync(x)); + var tasks = appNames.Select(x => GetAppAsync(x)); var apps = await Task.WhenAll(tasks); - return apps.Where(a => a != null).ToList(); + return apps.Where(a => a != null && a.Contributors.ContainsKey(userId)).ToList(); } } } diff --git a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrain.cs b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrain.cs index b32b7539e..b7e1feab2 100644 --- a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrain.cs +++ b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrain.cs @@ -10,6 +10,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; using Squidex.Domain.Apps.Core.Schemas; +using Squidex.Domain.Apps.Events; using Squidex.Domain.Apps.Events.Apps; using Squidex.Domain.Apps.Read.Apps; using Squidex.Domain.Apps.Read.Rules; @@ -126,7 +127,13 @@ namespace Squidex.Domain.Apps.Read.State.Grains } } - State.Apply(message); + if (message.Payload is AppEvent appEvent) + { + if (State.App == null || State.App.Id == appEvent.AppId.Id) + { + State.Apply(message); + } + } return WriteStateAsync(); }).Unwrap(); diff --git a/src/Squidex.Infrastructure/InMemoryPubSub.cs b/src/Squidex.Infrastructure/InMemoryPubSub.cs index a4ace58fd..accb39cb4 100644 --- a/src/Squidex.Infrastructure/InMemoryPubSub.cs +++ b/src/Squidex.Infrastructure/InMemoryPubSub.cs @@ -15,10 +15,20 @@ namespace Squidex.Infrastructure public sealed class InMemoryPubSub : IPubSub { private readonly Subject subject = new Subject(); + private readonly bool publishAlways; + + public InMemoryPubSub() + { + } + + public InMemoryPubSub(bool publishAlways) + { + this.publishAlways = publishAlways; + } public void Publish(T value, bool notifySelf) { - if (notifySelf) + if (notifySelf || publishAlways) { subject.OnNext(value); } diff --git a/src/Squidex.Infrastructure/States/StateHolder.cs b/src/Squidex.Infrastructure/States/StateHolder.cs index 098142ea6..185469c2b 100644 --- a/src/Squidex.Infrastructure/States/StateHolder.cs +++ b/src/Squidex.Infrastructure/States/StateHolder.cs @@ -39,11 +39,18 @@ namespace Squidex.Infrastructure.States public async Task WriteAsync() { - var newEtag = Guid.NewGuid().ToString(); + try + { + var newEtag = Guid.NewGuid().ToString(); - await store.WriteAsync(key, State, etag, newEtag); + await store.WriteAsync(key, State, etag, newEtag); - etag = newEtag; + etag = newEtag; + } + finally + { + written(); + } } } } diff --git a/tests/Squidex.Infrastructure.Tests/States/StatesTests.cs b/tests/Squidex.Infrastructure.Tests/States/StatesTests.cs index ba712b1b6..150af75c3 100644 --- a/tests/Squidex.Infrastructure.Tests/States/StatesTests.cs +++ b/tests/Squidex.Infrastructure.Tests/States/StatesTests.cs @@ -28,7 +28,7 @@ namespace Squidex.Infrastructure.States private readonly string key = Guid.NewGuid().ToString(); private readonly MyStatefulObject state = new MyStatefulObject(); private readonly IMemoryCache cache = new MemoryCache(Options.Create(new MemoryCacheOptions())); - private readonly IPubSub pubSub = new InMemoryPubSub(); + private readonly IPubSub pubSub = new InMemoryPubSub(true); private readonly IServiceProvider services = A.Fake(); private readonly IStateStore store = A.Fake(); private readonly StateFactory sut; @@ -97,6 +97,13 @@ namespace Squidex.Infrastructure.States { var etag = Guid.NewGuid().ToString(); + InvalidateMessage message = null; + + pubSub.Subscribe(m => + { + message = m; + }); + A.CallTo(() => store.ReadAsync(key)) .Returns((123, etag)); @@ -113,6 +120,9 @@ namespace Squidex.Infrastructure.States A.CallTo(() => store.WriteAsync(key, 456, etag, A.That.Matches(x => x != null))) .MustHaveHappened(); + + Assert.NotNull(message); + Assert.Equal(key, message.Key); } [Fact]