1
0
mirror of https://github.com/bitwarden/server.git synced 2025-02-16 01:51:21 +01:00

Add DeleteManyAsync and tests

This commit is contained in:
Brandon 2024-11-12 12:40:55 -05:00
parent 97b3be26f0
commit 13ab036f91
No known key found for this signature in database
GPG Key ID: A0E0EF0B207BA40D
2 changed files with 27 additions and 23 deletions

View File

@ -274,35 +274,34 @@ public class UserRepository : Repository<Core.Entities.User, User, Guid>, IUserR
var transaction = await dbContext.Database.BeginTransactionAsync();
dbContext.WebAuthnCredentials.RemoveRange(dbContext.WebAuthnCredentials.Where(w => users.Any(u => u.Id == w.UserId)));
dbContext.Ciphers.RemoveRange(dbContext.Ciphers.Where(c => users.Any(u => u.Id == c.UserId)));
dbContext.Folders.RemoveRange(dbContext.Folders.Where(f => users.Any(u => u.Id == f.UserId)));
dbContext.AuthRequests.RemoveRange(dbContext.AuthRequests.Where(s => users.Any(u => u.Id == s.UserId)));
dbContext.Devices.RemoveRange(dbContext.Devices.Where(d => users.Any(u => u.Id == d.UserId)));
var targetIds = users.Select(u => u.Id).ToList();
await dbContext.WebAuthnCredentials.Where(wa => targetIds.Contains(wa.UserId)).ExecuteDeleteAsync();
await dbContext.Ciphers.Where(c => targetIds.Contains(c.UserId ?? default)).ExecuteDeleteAsync();
await dbContext.Folders.Where(f => targetIds.Contains(f.UserId)).ExecuteDeleteAsync();
await dbContext.AuthRequests.Where(a => targetIds.Contains(a.UserId)).ExecuteDeleteAsync();
await dbContext.Devices.Where(d => targetIds.Contains(d.UserId)).ExecuteDeleteAsync();
var collectionUsers = from cu in dbContext.CollectionUsers
join ou in dbContext.OrganizationUsers on cu.OrganizationUserId equals ou.Id
where users.Any(u => u.Id == ou.UserId)
where targetIds.Contains(ou.UserId ?? default)
select cu;
dbContext.CollectionUsers.RemoveRange(collectionUsers);
var groupUsers = from gu in dbContext.GroupUsers
join ou in dbContext.OrganizationUsers on gu.OrganizationUserId equals ou.Id
where users.Any(u => u.Id == ou.UserId)
where targetIds.Contains(ou.UserId ?? default)
select gu;
dbContext.GroupUsers.RemoveRange(groupUsers);
dbContext.UserProjectAccessPolicy.RemoveRange(
dbContext.UserProjectAccessPolicy.Where(ap => users.Any(u => u.Id == ap.OrganizationUser.UserId)));
dbContext.UserServiceAccountAccessPolicy.RemoveRange(
dbContext.UserServiceAccountAccessPolicy.Where(ap => users.Any(u => u.Id == ap.OrganizationUser.UserId)));
dbContext.OrganizationUsers.RemoveRange(dbContext.OrganizationUsers.Where(ou => users.Any(u => u.Id == ou.UserId)));
dbContext.ProviderUsers.RemoveRange(dbContext.ProviderUsers.Where(pu => users.Any(u => u.Id == pu.UserId)));
dbContext.SsoUsers.RemoveRange(dbContext.SsoUsers.Where(su => users.Any(u => u.Id == su.UserId)));
dbContext.EmergencyAccesses.RemoveRange(
dbContext.EmergencyAccesses.Where(ea => users.Any(u => u.Id == ea.GrantorId || u.Id == ea.GranteeId)));
dbContext.Sends.RemoveRange(dbContext.Sends.Where(s => users.Any(u => u.Id == s.UserId)));
dbContext.NotificationStatuses.RemoveRange(dbContext.NotificationStatuses.Where(ns => users.Any(u => u.Id == ns.UserId)));
dbContext.Notifications.RemoveRange(dbContext.Notifications.Where(n => users.Any(u => u.Id == n.UserId)));
await dbContext.UserProjectAccessPolicy.Where(ap => targetIds.Contains(ap.OrganizationUser.UserId ?? default)).ExecuteDeleteAsync();
await dbContext.UserServiceAccountAccessPolicy.Where(ap => targetIds.Contains(ap.OrganizationUser.UserId ?? default)).ExecuteDeleteAsync();
await dbContext.OrganizationUsers.Where(ou => targetIds.Contains(ou.UserId ?? default)).ExecuteDeleteAsync();
await dbContext.ProviderUsers.Where(pu => targetIds.Contains(pu.UserId ?? default)).ExecuteDeleteAsync();
await dbContext.SsoUsers.Where(su => targetIds.Contains(su.UserId)).ExecuteDeleteAsync();
await dbContext.EmergencyAccesses.Where(ea => targetIds.Contains(ea.GrantorId) || targetIds.Contains(ea.GranteeId ?? default)).ExecuteDeleteAsync();
await dbContext.Sends.Where(s => targetIds.Contains(s.UserId ?? default)).ExecuteDeleteAsync();
await dbContext.NotificationStatuses.Where(ns => targetIds.Contains(ns.UserId)).ExecuteDeleteAsync();
await dbContext.Notifications.Where(n => targetIds.Contains(n.UserId ?? default)).ExecuteDeleteAsync();
foreach (User u in users)
foreach (var u in users)
{
var mappedUser = Mapper.Map<User>(u);
dbContext.Users.Remove(mappedUser);

View File

@ -97,6 +97,7 @@ public class UserRepositoryTests
{
foreach (var sut in suts)
{
List<User> efUserList = new List<User>();
foreach (var user in users)
{
var postEfUser = await sut.CreateAsync(user);
@ -105,11 +106,15 @@ public class UserRepositoryTests
var savedEfUser = await sut.GetByIdAsync(postEfUser.Id);
Assert.True(savedEfUser != null);
sut.ClearChangeTracking();
efUserList.Add(savedEfUser);
}
await sut.DeleteAsync(savedEfUser);
sut.ClearChangeTracking();
await sut.DeleteManyAsync(efUserList);
sut.ClearChangeTracking();
savedEfUser = await sut.GetByIdAsync(savedEfUser.Id);
foreach (var efUser in efUserList)
{
var savedEfUser = await sut.GetByIdAsync(efUser.Id);
Assert.True(savedEfUser == null);
}
}