using AutoMapper; using MediatR; using Mws.Application.Common; namespace Mws.Application.Roles; public record UpdateRoleCommand(Guid Id, SaveRoleRequest Request) : IRequest; public class UpdateRoleHandler(IUnitOfWork uow, IMapper mapper) : IRequestHandler { public async Task Handle(UpdateRoleCommand command, CancellationToken ct) { var role = await uow.Roles.GetByIdWithPermissionsAsync(command.Id, ct) ?? throw new NotFoundException("Role not found"); var name = command.Request.Name.Trim(); if (string.IsNullOrWhiteSpace(name)) { throw new BadRequestException("Role name is required"); } if (await uow.Roles.ExistsByNameAsync(name, command.Id, ct)) { throw new BadRequestException("Role name already exists"); } role.Name = name; role.UpdatedAt = DateTime.UtcNow; uow.Roles.RemovePermissions(role.Permissions.ToList()); role.Permissions = RolePermissionBuilder.Build(command.Request.Permissions); foreach (var p in role.Permissions) { p.RoleId = role.Id; } await uow.SaveChangesAsync(ct); return mapper.Map(role); } }