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)

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(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.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);
}
}
}

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

@ -48,7 +48,7 @@ namespace Squidex.Domain.Users
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);
}

6
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();

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

@ -18,7 +18,7 @@ namespace Squidex.Shared.Users
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);

16
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<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();
}

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));
}
[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]
public async Task Update_should_do_nothing_for_new_update()
{

Loading…
Cancel
Save