< Summary

Information
Class: FAU.API.Controllers.AuthController
Assembly: FAU.API
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.API/Controllers/AuthController.cs
Line coverage
96%
Covered lines: 73
Uncovered lines: 3
Coverable lines: 76
Total lines: 163
Line coverage: 96%
Branch coverage
66%
Covered branches: 8
Total branches: 12
Branch coverage: 66.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Login()62.5%88100%
Register()75%4483.33%
GetPermisos()100%11100%

File(s)

/home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.API/Controllers/AuthController.cs

#LineLine coverage
 1using FAU.Logica.DTOs;
 2using FAU.Logica.Services;
 3using FAU.DataAccess.Repositories;
 4using Microsoft.AspNetCore.Authorization;
 5using Microsoft.AspNetCore.Http;
 6using Microsoft.AspNetCore.Mvc;
 7
 8namespace FAU.API.Controllers;
 9
 10/// <summary>
 11/// Controlador de autenticación
 12/// </summary>
 13[ApiController]
 14[Route("api/[controller]")]
 15[Produces("application/json")]
 16public class AuthController : ControllerBase
 17{
 18    private readonly IAuthService _authService;
 19    private readonly IUsuarioService _usuarioService;
 20    private readonly IPermisoRepository _permisoRepository;
 21    private readonly ILogger<AuthController> _logger;
 22
 723    public AuthController(
 724        IAuthService authService,
 725        IUsuarioService usuarioService,
 726        IPermisoRepository permisoRepository,
 727        ILogger<AuthController> logger)
 28    {
 729        _authService = authService;
 730        _usuarioService = usuarioService;
 731        _permisoRepository = permisoRepository;
 732        _logger = logger;
 733    }
 34
 35    /// <summary>
 36    /// Login de usuario - Endpoint principal de autenticación
 37    /// POST /api/auth/login
 38    /// </summary>
 39    [HttpPost("login")]
 40    [AllowAnonymous]
 41    [ProducesResponseType(typeof(ApiResponse<LoginResponse>), StatusCodes.Status200OK)]
 42    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status401Unauthorized)]
 43    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 44    public async Task<IActionResult> Login([FromBody] LoginRequest request)
 45    {
 46        try
 47        {
 348            var (success, token, error) = await _authService.LoginAsync(request.Username, request.Password);
 49
 250            if (!success)
 51            {
 152                return Unauthorized(ApiResponse<string>.ErrorResult(error ?? "Credenciales inválidas"));
 53            }
 54
 155            var usuario = await _usuarioService.GetByUsernameWithRolesAsync(request.Username);
 56
 157            var response = new LoginResponse
 158            {
 159                Success = true,
 160                Token = token,
 161                Usuario = usuario != null ? new UsuarioDto
 162                {
 163                    Id = usuario.Id,
 164                    Username = usuario.Username,
 165                    Estado = usuario.Estado,
 166                    PersonaId = usuario.PersonaId,
 167                    Persona = usuario.Persona != null ? new PersonaDto
 168                    {
 169                        Id = usuario.Persona.Id,
 170                        Cedula = usuario.Persona.Cedula,
 171                        Nombre = usuario.Persona.PrimerNombre,
 172                        Apellido = usuario.Persona.PrimerApellido,
 173                        Email = usuario.Persona.Email,
 174                        Telefono = usuario.Persona.Telefono
 175                    } : null,
 176                    Roles = usuario.Roles.Select(r => new RolDto
 177                    {
 178                        Id = r.Id,
 179                        Nombre = r.Nombre,
 180                        Descripcion = r.Descripcion
 181                    }).ToList()
 182                } : null
 183            };
 84
 185            return Ok(ApiResponse<LoginResponse>.SuccessResult(response, "Login exitoso"));
 86        }
 187        catch (Exception ex)
 88        {
 189            _logger.LogError(ex, "Error en login");
 190            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 91        }
 392    }
 93
 94    /// <summary>
 95    /// Registro de nuevo usuario. Requiere autenticación con rol Administrador.
 96    /// POST /api/auth/register
 97    /// </summary>
 98    [HttpPost("register")]
 99    [Authorize(Roles = "Administrador")]
 100    [ProducesResponseType(typeof(ApiResponse<UsuarioDto>), StatusCodes.Status200OK)]
 101    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status400BadRequest)]
 102    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 103    public async Task<IActionResult> Register([FromBody] RegisterRequest request)
 104    {
 105        try
 106        {
 2107            var (success, usuario, error) = await _authService.RegisterAsync(
 2108                request.Username,
 2109                request.Password,
 2110                request.PersonaId);
 111
 2112            if (!success)
 113            {
 1114                return BadRequest(ApiResponse<string>.ErrorResult(error ?? "Error al registrar usuario"));
 115            }
 116
 1117            var usuarioDto = new UsuarioDto
 1118            {
 1119                Id = usuario!.Id,
 1120                Username = usuario.Username,
 1121                Estado = usuario.Estado,
 1122                PersonaId = usuario.PersonaId
 1123            };
 124
 1125            return Ok(ApiResponse<UsuarioDto>.SuccessResult(usuarioDto, "Usuario registrado exitosamente"));
 126        }
 0127        catch (Exception ex)
 128        {
 0129            _logger.LogError(ex, "Error en registro");
 0130            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 131        }
 2132    }
 133
 134    /// <summary>
 135    /// Listar todos los permisos disponibles
 136    /// GET /api/auth/permisos
 137    /// </summary>
 138    [HttpGet("permisos")]
 139    [Authorize]
 140    [ProducesResponseType(typeof(ApiResponse<List<PermisoDto>>), StatusCodes.Status200OK)]
 141    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 142    public async Task<IActionResult> GetPermisos()
 143    {
 144        try
 145        {
 2146            var permisos = await _permisoRepository.GetAllAsync();
 147
 4148            var permisosDto = permisos.Select(p => new PermisoDto
 4149            {
 4150                Id = p.Id,
 4151                Nombre = p.Nombre,
 4152                Descripcion = p.Descripcion
 4153            }).ToList();
 154
 1155            return Ok(ApiResponse<List<PermisoDto>>.SuccessResult(permisosDto));
 156        }
 1157        catch (Exception ex)
 158        {
 1159            _logger.LogError(ex, "Error al obtener permisos");
 1160            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 161        }
 2162    }
 163}