using AutoMapper; using MediatR; using mws.backend.dotnet.application.Audit; using mws.backend.dotnet.application.Common; namespace mws.backend.dotnet.application.Permissions; public record UpdateRoleCommand(Guid Id, SaveRoleRequest Request) : IRequest, IAuditableRequest { public string Action => "Role.Update"; public string EntityType => "Role"; public Guid? EntityId => Id; public string? EntityName => Request.Name; } 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); } }