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());
}
}