using SIGCM2.Application.Abstractions; using SIGCM2.Application.Abstractions.Persistence; using SIGCM2.Application.Roles.Dtos; using SIGCM2.Domain.Entities; using SIGCM2.Domain.Exceptions; namespace SIGCM2.Application.Roles.Create; public sealed class CreateRolCommandHandler : ICommandHandler { private readonly IRolRepository _repository; public CreateRolCommandHandler(IRolRepository repository) { _repository = repository; } public async Task Handle(CreateRolCommand command) { // Check-then-insert: explicit check produces a clear 409 message. // SqlException 2627 (UQ violation) acts as race-condition fallback — caught in ExceptionFilter. var existing = await _repository.GetByCodigoAsync(command.Codigo); if (existing is not null) throw new RolAlreadyExistsException(command.Codigo); var rol = Rol.ForCreation(command.Codigo, command.Nombre, command.Descripcion); var newId = await _repository.AddAsync(rol); return new RolCreatedDto( Id: newId, Codigo: rol.Codigo, Nombre: rol.Nombre, Descripcion: rol.Descripcion, Activo: rol.Activo); } }