- 从多个文件中移除未使用的 System.Linq.Dynamic.Core 引用 - 从多个文件中移除未使用的 Microsoft.EntityFrameworkCore 引用 - 从 IM 模块中移除未使用的 MongoDB.Driver.Linq 引用 - 清理 Handler 文件中的冗余命名空间引用 - 优化代码结构减少不必要的依赖引入 - 提高代码整洁性和编译效率
35 lines
1.6 KiB
C#
35 lines
1.6 KiB
C#
using BuildFlow.Shared.Domain.Exceptions;
|
||
using MediatR;
|
||
using BuildFlow.Application.Roles.DTOs;
|
||
using BuildFlow.Domain.Entities;
|
||
using BuildFlow.Infrastructure.Persistence;
|
||
using BuildFlow.Application.Roles.Commands;
|
||
|
||
namespace BuildFlow.Application.Roles.Handlers;
|
||
|
||
/// <summary>
|
||
/// Assign权限sCommand处理器。执行业务校验后持久化。
|
||
/// </summary>
|
||
public class AssignPermissionsCommandHandler(RagDbContext db) : IRequestHandler<AssignPermissionsCommand, RoleDto>
|
||
{
|
||
public async Task<RoleDto> Handle(AssignPermissionsCommand request, CancellationToken ct)
|
||
{
|
||
var role = await db.Roles.Include(r => r.RolePermissions).ThenInclude(rp => rp.Permission)
|
||
.FirstOrDefaultAsync(r => r.Id == request.RoleId, ct)
|
||
?? throw new NotFoundException("角色不存在");
|
||
|
||
var permissions = await db.Permissions.Where(p => request.PermissionIds.Contains(p.Id)).ToListAsync(ct);
|
||
// 计数校验:查回的数量必须与请求数量一致,否则说明传入含无效 Id,拒绝执行以免权限静默丢失
|
||
if (permissions.Count != request.PermissionIds.Count)
|
||
throw new NotFoundException("部分权限不存在");
|
||
|
||
db.RolePermissions.RemoveRange(role.RolePermissions);
|
||
await db.RolePermissions.AddRangeAsync(
|
||
permissions.Select(p => new RolePermission { RoleId = role.Id, PermissionId = p.Id }), ct);
|
||
await db.SaveChangesAsync(ct);
|
||
|
||
return new RoleDto(role.Id, role.Name, role.Description, role.CreatedAt,
|
||
permissions.Select(p => p.Code).ToList());
|
||
}
|
||
}
|