From e504a4d88adb0ace12d9b959ad119c542681073d Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 6 Apr 2021 20:06:36 +0200 Subject: [PATCH] Silent user update to prevent loop. --- .../History/NotifoService.cs | 2 +- .../DefaultUserResolver.cs | 4 ++-- .../DefaultUserService.cs | 19 +++++++++++-------- .../src/Squidex.Domain.Users/IUserService.cs | 2 +- .../Commands/Rebuilder.cs | 6 ++++-- .../src/Squidex.Shared/Users/IUserResolver.cs | 2 +- .../DefaultUserResolverTests.cs | 16 ++++++++++++++-- .../DefaultUserServiceTests.cs | 13 +++++++++++++ 8 files changed, 47 insertions(+), 17 deletions(-) diff --git a/backend/src/Squidex.Domain.Apps.Entities/History/NotifoService.cs b/backend/src/Squidex.Domain.Apps.Entities/History/NotifoService.cs index d66decb0b..98212ff1b 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/History/NotifoService.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/History/NotifoService.cs @@ -112,7 +112,7 @@ namespace Squidex.Domain.Apps.Entities.History } }); - await userResolver.SetClaimAsync(user.Id, SquidexClaimTypes.NotifoKey, response.First().ApiKey); + await userResolver.SetClaimAsync(user.Id, SquidexClaimTypes.NotifoKey, response.First().ApiKey, true); } public async Task HandleEventsAsync(IEnumerable<(Envelope AppEvent, HistoryEvent? HistoryEvent)> events) diff --git a/backend/src/Squidex.Domain.Users/DefaultUserResolver.cs b/backend/src/Squidex.Domain.Users/DefaultUserResolver.cs index fcfb27540..390257e9d 100644 --- a/backend/src/Squidex.Domain.Users/DefaultUserResolver.cs +++ b/backend/src/Squidex.Domain.Users/DefaultUserResolver.cs @@ -56,7 +56,7 @@ namespace Squidex.Domain.Users } } - public async Task SetClaimAsync(string id, string type, string value) + public async Task SetClaimAsync(string id, string type, string value, bool silent) { Guard.NotNullOrEmpty(id, nameof(id)); Guard.NotNullOrEmpty(type, nameof(type)); @@ -74,7 +74,7 @@ namespace Squidex.Domain.Users } }; - await userService.UpdateAsync(id, values); + await userService.UpdateAsync(id, values, silent); } } diff --git a/backend/src/Squidex.Domain.Users/DefaultUserService.cs b/backend/src/Squidex.Domain.Users/DefaultUserService.cs index b08d311cf..37653b29a 100644 --- a/backend/src/Squidex.Domain.Users/DefaultUserService.cs +++ b/backend/src/Squidex.Domain.Users/DefaultUserService.cs @@ -248,7 +248,7 @@ namespace Squidex.Domain.Users }); } - public async Task UpdateAsync(string id, UserValues values) + public async Task UpdateAsync(string id, UserValues values, bool silent = false) { Guard.NotNullOrEmpty(id, nameof(id)); Guard.NotNull(values, nameof(values)); @@ -277,16 +277,19 @@ namespace Squidex.Domain.Users var resolved = await ResolveAsync(user); - foreach (var @events in userEvents) - { - @events.OnUserUpdated(resolved); - } - - if (HasConsentGiven(values, oldUser)) + if (!silent) { foreach (var @events in userEvents) { - @events.OnConsentGiven(resolved); + @events.OnUserUpdated(resolved); + } + + if (HasConsentGiven(values, oldUser)) + { + foreach (var @events in userEvents) + { + @events.OnConsentGiven(resolved); + } } } diff --git a/backend/src/Squidex.Domain.Users/IUserService.cs b/backend/src/Squidex.Domain.Users/IUserService.cs index d70dc8cc8..9d98742f2 100644 --- a/backend/src/Squidex.Domain.Users/IUserService.cs +++ b/backend/src/Squidex.Domain.Users/IUserService.cs @@ -48,7 +48,7 @@ namespace Squidex.Domain.Users Task UnlockAsync(string id); - Task UpdateAsync(string id, UserValues values); + Task UpdateAsync(string id, UserValues values, bool silent = false); Task DeleteAsync(string id); } diff --git a/backend/src/Squidex.Infrastructure/Commands/Rebuilder.cs b/backend/src/Squidex.Infrastructure/Commands/Rebuilder.cs index 8d8c5f1cc..c599f4c57 100644 --- a/backend/src/Squidex.Infrastructure/Commands/Rebuilder.cs +++ b/backend/src/Squidex.Infrastructure/Commands/Rebuilder.cs @@ -133,12 +133,14 @@ namespace Squidex.Infrastructure.Commands using (localCache.StartContext()) { - await source(async id => + await source(id => { if (handledIds.Add(id)) { - await batchBlock.SendAsync(id, ct); + return batchBlock.SendAsync(id, ct); } + + return Task.CompletedTask; }); batchBlock.Complete(); diff --git a/backend/src/Squidex.Shared/Users/IUserResolver.cs b/backend/src/Squidex.Shared/Users/IUserResolver.cs index 487996d28..c30d50b51 100644 --- a/backend/src/Squidex.Shared/Users/IUserResolver.cs +++ b/backend/src/Squidex.Shared/Users/IUserResolver.cs @@ -18,7 +18,7 @@ namespace Squidex.Shared.Users Task FindByIdAsync(string idOrEmail); - Task SetClaimAsync(string id, string type, string value); + Task SetClaimAsync(string id, string type, string value, bool silent = false); Task> QueryByEmailAsync(string email); diff --git a/backend/tests/Squidex.Domain.Users.Tests/DefaultUserResolverTests.cs b/backend/tests/Squidex.Domain.Users.Tests/DefaultUserResolverTests.cs index 99f58a01d..aea99e108 100644 --- a/backend/tests/Squidex.Domain.Users.Tests/DefaultUserResolverTests.cs +++ b/backend/tests/Squidex.Domain.Users.Tests/DefaultUserResolverTests.cs @@ -82,10 +82,22 @@ namespace Squidex.Domain.Users { var id = "123"; - await sut.SetClaimAsync(id, "my-claim", "my-value"); + await sut.SetClaimAsync(id, "my-claim", "my-value", false); A.CallTo(() => userService.UpdateAsync(id, - A.That.Matches(x => x.CustomClaims!.Any(y => y.Type == "my-claim" && y.Value == "my-value")))) + A.That.Matches(x => x.CustomClaims!.Any(y => y.Type == "my-claim" && y.Value == "my-value")), false)) + .MustHaveHappened(); + } + + [Fact] + public async Task Should_add_claim_when_not_added_yet_silently() + { + var id = "123"; + + await sut.SetClaimAsync(id, "my-claim", "my-value", true); + + A.CallTo(() => userService.UpdateAsync(id, + A.That.Matches(x => x.CustomClaims!.Any(y => y.Type == "my-claim" && y.Value == "my-value")), true)) .MustHaveHappened(); } diff --git a/backend/tests/Squidex.Domain.Users.Tests/DefaultUserServiceTests.cs b/backend/tests/Squidex.Domain.Users.Tests/DefaultUserServiceTests.cs index e80c6fabe..24e68052d 100644 --- a/backend/tests/Squidex.Domain.Users.Tests/DefaultUserServiceTests.cs +++ b/backend/tests/Squidex.Domain.Users.Tests/DefaultUserServiceTests.cs @@ -298,6 +298,19 @@ namespace Squidex.Domain.Users await Assert.ThrowsAsync(() => sut.UpdateAsync(identity.Id, update)); } + [Fact] + public async Task Update_should_not_invoke_events_if_silent() + { + var update = new UserValues(); + + var identity = CreateIdentity(found: true); + + await sut.UpdateAsync(identity.Id, update, true); + + A.CallTo(() => userEvents.OnUserUpdated(A.That.Matches(x => x.Identity == identity))) + .MustNotHaveHappened(); + } + [Fact] public async Task Update_should_do_nothing_for_new_update() {