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; /// /// Assign权限sCommand处理器。执行业务校验后持久化。 /// public class AssignPermissionsCommandHandler(RagDbContext db) : IRequestHandler { public async Task 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()); } }