fix: wrap role/user permission replacements in transactions
This commit is contained in:
@@ -28,11 +28,14 @@ public sealed class EfRolePermissionRepository(IdentityDbContext dbContext) : IR
|
|||||||
|
|
||||||
public async Task ReplaceRolePermissionsAsync(long tenantId, long roleId, IEnumerable<long> permissionIds, CancellationToken cancellationToken = default)
|
public async Task ReplaceRolePermissionsAsync(long tenantId, long roleId, IEnumerable<long> permissionIds, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
|
await using var trx = await dbContext.Database.BeginTransactionAsync(cancellationToken);
|
||||||
|
|
||||||
var existing = await dbContext.RolePermissions
|
var existing = await dbContext.RolePermissions
|
||||||
.Where(x => x.TenantId == tenantId && x.RoleId == roleId)
|
.Where(x => x.TenantId == tenantId && x.RoleId == roleId)
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
dbContext.RolePermissions.RemoveRange(existing);
|
dbContext.RolePermissions.RemoveRange(existing);
|
||||||
|
await dbContext.SaveChangesAsync(cancellationToken);
|
||||||
|
|
||||||
var toAdd = permissionIds.Distinct().Select(permissionId => new RolePermission
|
var toAdd = permissionIds.Distinct().Select(permissionId => new RolePermission
|
||||||
{
|
{
|
||||||
@@ -42,6 +45,8 @@ public sealed class EfRolePermissionRepository(IdentityDbContext dbContext) : IR
|
|||||||
});
|
});
|
||||||
|
|
||||||
await dbContext.RolePermissions.AddRangeAsync(toAdd, cancellationToken);
|
await dbContext.RolePermissions.AddRangeAsync(toAdd, cancellationToken);
|
||||||
|
await dbContext.SaveChangesAsync(cancellationToken);
|
||||||
|
await trx.CommitAsync(cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task SaveChangesAsync(CancellationToken cancellationToken = default)
|
public Task SaveChangesAsync(CancellationToken cancellationToken = default)
|
||||||
|
|||||||
@@ -23,11 +23,14 @@ public sealed class EfUserRoleRepository(IdentityDbContext dbContext) : IUserRol
|
|||||||
|
|
||||||
public async Task ReplaceUserRolesAsync(long tenantId, long userId, IEnumerable<long> roleIds, CancellationToken cancellationToken = default)
|
public async Task ReplaceUserRolesAsync(long tenantId, long userId, IEnumerable<long> roleIds, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
|
await using var trx = await dbContext.Database.BeginTransactionAsync(cancellationToken);
|
||||||
|
|
||||||
var existing = await dbContext.UserRoles
|
var existing = await dbContext.UserRoles
|
||||||
.Where(x => x.TenantId == tenantId && x.UserId == userId)
|
.Where(x => x.TenantId == tenantId && x.UserId == userId)
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
dbContext.UserRoles.RemoveRange(existing);
|
dbContext.UserRoles.RemoveRange(existing);
|
||||||
|
await dbContext.SaveChangesAsync(cancellationToken);
|
||||||
|
|
||||||
var toAdd = roleIds.Distinct().Select(roleId => new UserRole
|
var toAdd = roleIds.Distinct().Select(roleId => new UserRole
|
||||||
{
|
{
|
||||||
@@ -37,6 +40,8 @@ public sealed class EfUserRoleRepository(IdentityDbContext dbContext) : IUserRol
|
|||||||
});
|
});
|
||||||
|
|
||||||
await dbContext.UserRoles.AddRangeAsync(toAdd, cancellationToken);
|
await dbContext.UserRoles.AddRangeAsync(toAdd, cancellationToken);
|
||||||
|
await dbContext.SaveChangesAsync(cancellationToken);
|
||||||
|
await trx.CommitAsync(cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task SaveChangesAsync(CancellationToken cancellationToken = default)
|
public Task SaveChangesAsync(CancellationToken cancellationToken = default)
|
||||||
|
|||||||
Reference in New Issue
Block a user