fix: wrap identity permission bindings with execution strategy transactions
This commit is contained in:
@@ -28,25 +28,30 @@ public sealed class EfRolePermissionRepository(IdentityDbContext dbContext) : IR
|
||||
|
||||
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
|
||||
.Where(x => x.TenantId == tenantId && x.RoleId == roleId)
|
||||
.ToListAsync(cancellationToken);
|
||||
|
||||
dbContext.RolePermissions.RemoveRange(existing);
|
||||
await dbContext.SaveChangesAsync(cancellationToken);
|
||||
|
||||
var toAdd = permissionIds.Distinct().Select(permissionId => new RolePermission
|
||||
var strategy = dbContext.Database.CreateExecutionStrategy();
|
||||
await strategy.ExecuteAsync(async () =>
|
||||
{
|
||||
TenantId = tenantId,
|
||||
RoleId = roleId,
|
||||
PermissionId = permissionId
|
||||
});
|
||||
await using var trx = await dbContext.Database.BeginTransactionAsync(cancellationToken);
|
||||
|
||||
await dbContext.RolePermissions.AddRangeAsync(toAdd, cancellationToken);
|
||||
await dbContext.SaveChangesAsync(cancellationToken);
|
||||
await trx.CommitAsync(cancellationToken);
|
||||
var existing = await dbContext.RolePermissions
|
||||
.Where(x => x.TenantId == tenantId && x.RoleId == roleId)
|
||||
.ToListAsync(cancellationToken);
|
||||
|
||||
dbContext.RolePermissions.RemoveRange(existing);
|
||||
await dbContext.SaveChangesAsync(cancellationToken);
|
||||
|
||||
var toAdd = permissionIds.Distinct().Select(permissionId => new RolePermission
|
||||
{
|
||||
TenantId = tenantId,
|
||||
RoleId = roleId,
|
||||
PermissionId = permissionId
|
||||
});
|
||||
|
||||
await dbContext.RolePermissions.AddRangeAsync(toAdd, cancellationToken);
|
||||
await dbContext.SaveChangesAsync(cancellationToken);
|
||||
|
||||
await trx.CommitAsync(cancellationToken);
|
||||
});
|
||||
}
|
||||
|
||||
public Task SaveChangesAsync(CancellationToken cancellationToken = default)
|
||||
|
||||
Reference in New Issue
Block a user