using AutoMapper; using MediatR; using mws.backend.dotnet.application.Audit; using mws.backend.dotnet.application.Common; using mws.backend.dotnet.domain.Roles; namespace mws.backend.dotnet.application.Permissions; public record CreateRoleCommand(SaveRoleRequest Request) : IRequest, IAuditableRequest { public string Action => "Role.Create"; public string EntityType => "Role"; public string? EntityName => Request.Name; } public class CreateRoleHandler(IUnitOfWork uow, IMapper mapper) : IRequestHandler { public async Task Handle(CreateRoleCommand command, CancellationToken ct) { var name = command.Request.Name.Trim(); if (string.IsNullOrWhiteSpace(name)) { throw new BadRequestException("Role name is required"); } if (await uow.Roles.ExistsByNameAsync(name, null, ct)) { throw new BadRequestException("Role name already exists"); } var now = DateTime.UtcNow; var role = new Role { Id = Guid.NewGuid(), Name = name, IsSystem = false, CreatedAt = now, UpdatedAt = now, Permissions = RolePermissionBuilder.Build(command.Request.Permissions), }; uow.Roles.Add(role); await uow.SaveChangesAsync(ct); return mapper.Map(role); } }