Browse Source

Silent user update to prevent loop.

pull/681/head
Sebastian Stehle 5 years ago
parent
commit
e504a4d88a
  1. 2
      backend/src/Squidex.Domain.Apps.Entities/History/NotifoService.cs
  2. 4
      backend/src/Squidex.Domain.Users/DefaultUserResolver.cs
  3. 19
      backend/src/Squidex.Domain.Users/DefaultUserService.cs
  4. 2
      backend/src/Squidex.Domain.Users/IUserService.cs
  5. 6
      backend/src/Squidex.Infrastructure/Commands/Rebuilder.cs
  6. 2
      backend/src/Squidex.Shared/Users/IUserResolver.cs
  7. 16
      backend/tests/Squidex.Domain.Users.Tests/DefaultUserResolverTests.cs
  8. 13
      backend/tests/Squidex.Domain.Users.Tests/DefaultUserServiceTests.cs

2
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> AppEvent, HistoryEvent? HistoryEvent)> events) public async Task HandleEventsAsync(IEnumerable<(Envelope<AppEvent> AppEvent, HistoryEvent? HistoryEvent)> events)

4
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(id, nameof(id));
Guard.NotNullOrEmpty(type, nameof(type)); Guard.NotNullOrEmpty(type, nameof(type));
@ -74,7 +74,7 @@ namespace Squidex.Domain.Users
} }
}; };
await userService.UpdateAsync(id, values); await userService.UpdateAsync(id, values, silent);
} }
} }

19
backend/src/Squidex.Domain.Users/DefaultUserService.cs

@ -248,7 +248,7 @@ namespace Squidex.Domain.Users
}); });
} }
public async Task<IUser> UpdateAsync(string id, UserValues values) public async Task<IUser> UpdateAsync(string id, UserValues values, bool silent = false)
{ {
Guard.NotNullOrEmpty(id, nameof(id)); Guard.NotNullOrEmpty(id, nameof(id));
Guard.NotNull(values, nameof(values)); Guard.NotNull(values, nameof(values));
@ -277,16 +277,19 @@ namespace Squidex.Domain.Users
var resolved = await ResolveAsync(user); var resolved = await ResolveAsync(user);
foreach (var @events in userEvents) if (!silent)
{
@events.OnUserUpdated(resolved);
}
if (HasConsentGiven(values, oldUser))
{ {
foreach (var @events in userEvents) foreach (var @events in userEvents)
{ {
@events.OnConsentGiven(resolved); @events.OnUserUpdated(resolved);
}
if (HasConsentGiven(values, oldUser))
{
foreach (var @events in userEvents)
{
@events.OnConsentGiven(resolved);
}
} }
} }

2
backend/src/Squidex.Domain.Users/IUserService.cs

@ -48,7 +48,7 @@ namespace Squidex.Domain.Users
Task<IUser> UnlockAsync(string id); Task<IUser> UnlockAsync(string id);
Task<IUser> UpdateAsync(string id, UserValues values); Task<IUser> UpdateAsync(string id, UserValues values, bool silent = false);
Task DeleteAsync(string id); Task DeleteAsync(string id);
} }

6
backend/src/Squidex.Infrastructure/Commands/Rebuilder.cs

@ -133,12 +133,14 @@ namespace Squidex.Infrastructure.Commands
using (localCache.StartContext()) using (localCache.StartContext())
{ {
await source(async id => await source(id =>
{ {
if (handledIds.Add(id)) if (handledIds.Add(id))
{ {
await batchBlock.SendAsync(id, ct); return batchBlock.SendAsync(id, ct);
} }
return Task.CompletedTask;
}); });
batchBlock.Complete(); batchBlock.Complete();

2
backend/src/Squidex.Shared/Users/IUserResolver.cs

@ -18,7 +18,7 @@ namespace Squidex.Shared.Users
Task<IUser?> FindByIdAsync(string idOrEmail); Task<IUser?> FindByIdAsync(string idOrEmail);
Task SetClaimAsync(string id, string type, string value); Task SetClaimAsync(string id, string type, string value, bool silent = false);
Task<List<IUser>> QueryByEmailAsync(string email); Task<List<IUser>> QueryByEmailAsync(string email);

16
backend/tests/Squidex.Domain.Users.Tests/DefaultUserResolverTests.cs

@ -82,10 +82,22 @@ namespace Squidex.Domain.Users
{ {
var id = "123"; 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.CallTo(() => userService.UpdateAsync(id,
A<UserValues>.That.Matches(x => x.CustomClaims!.Any(y => y.Type == "my-claim" && y.Value == "my-value")))) A<UserValues>.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<UserValues>.That.Matches(x => x.CustomClaims!.Any(y => y.Type == "my-claim" && y.Value == "my-value")), true))
.MustHaveHappened(); .MustHaveHappened();
} }

13
backend/tests/Squidex.Domain.Users.Tests/DefaultUserServiceTests.cs

@ -298,6 +298,19 @@ namespace Squidex.Domain.Users
await Assert.ThrowsAsync<DomainObjectNotFoundException>(() => sut.UpdateAsync(identity.Id, update)); await Assert.ThrowsAsync<DomainObjectNotFoundException>(() => 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<IUser>.That.Matches(x => x.Identity == identity)))
.MustNotHaveHappened();
}
[Fact] [Fact]
public async Task Update_should_do_nothing_for_new_update() public async Task Update_should_do_nothing_for_new_update()
{ {

Loading…
Cancel
Save