< 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
95%
Covered lines: 59
Uncovered lines: 3
Coverable lines: 62
Total lines: 129
Line coverage: 95.1%
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%

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 Microsoft.AspNetCore.Authorization;
 4using Microsoft.AspNetCore.Http;
 5using Microsoft.AspNetCore.Mvc;
 6
 7namespace FAU.API.Controllers;
 8
 9/// <summary>
 10/// Controlador de autenticación
 11/// </summary>
 12[ApiController]
 13[Route("api/[controller]")]
 14[Produces("application/json")]
 15public class AuthController : ControllerBase
 16{
 17    private readonly IAuthService _authService;
 18    private readonly IUsuarioService _usuarioService;
 19    private readonly ILogger<AuthController> _logger;
 20
 521    public AuthController(
 522        IAuthService authService,
 523        IUsuarioService usuarioService,
 524        ILogger<AuthController> logger)
 25    {
 526        _authService = authService;
 527        _usuarioService = usuarioService;
 528        _logger = logger;
 529    }
 30
 31    /// <summary>
 32    /// Login de usuario - Endpoint principal de autenticación
 33    /// POST /api/auth/login
 34    /// </summary>
 35    [HttpPost("login")]
 36    [AllowAnonymous]
 37    [ProducesResponseType(typeof(ApiResponse<LoginResponse>), StatusCodes.Status200OK)]
 38    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status401Unauthorized)]
 39    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 40    public async Task<IActionResult> Login([FromBody] LoginRequest request)
 41    {
 42        try
 43        {
 344            var (success, token, error) = await _authService.LoginAsync(request.Username, request.Password);
 45
 246            if (!success)
 47            {
 148                return Unauthorized(ApiResponse<string>.ErrorResult(error ?? "Credenciales inválidas"));
 49            }
 50
 151            var usuario = await _usuarioService.GetByUsernameWithRolesAsync(request.Username);
 52
 153            var response = new LoginResponse
 154            {
 155                Success = true,
 156                Token = token,
 157                Usuario = usuario != null ? new UsuarioDto
 158                {
 159                    Id = usuario.Id,
 160                    Username = usuario.Username,
 161                    Estado = usuario.Estado,
 162                    PersonaId = usuario.PersonaId,
 163                    Persona = usuario.Persona != null ? new PersonaDto
 164                    {
 165                        Id = usuario.Persona.Id,
 166                        Cedula = usuario.Persona.Cedula,
 167                        Nombre = usuario.Persona.PrimerNombre,
 168                        Apellido = usuario.Persona.PrimerApellido,
 169                        Email = usuario.Persona.Email,
 170                        Telefono = usuario.Persona.Telefono
 171                    } : null,
 172                    Roles = usuario.Roles.Select(r => new RolDto
 173                    {
 174                        Id = r.Id,
 175                        Nombre = r.Nombre,
 176                        Descripcion = r.Descripcion
 177                    }).ToList()
 178                } : null
 179            };
 80
 181            return Ok(ApiResponse<LoginResponse>.SuccessResult(response, "Login exitoso"));
 82        }
 183        catch (Exception ex)
 84        {
 185            _logger.LogError(ex, "Error en login");
 186            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 87        }
 388    }
 89
 90    /// <summary>
 91    /// Registro de nuevo usuario. Requiere autenticación con rol Administrador.
 92    /// POST /api/auth/register
 93    /// </summary>
 94    [HttpPost("register")]
 95    [Authorize(Roles = "Administrador")]
 96    [ProducesResponseType(typeof(ApiResponse<UsuarioDto>), StatusCodes.Status200OK)]
 97    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status400BadRequest)]
 98    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 99    public async Task<IActionResult> Register([FromBody] RegisterRequest request)
 100    {
 101        try
 102        {
 2103            var (success, usuario, error) = await _authService.RegisterAsync(
 2104                request.Username,
 2105                request.Password,
 2106                request.PersonaId);
 107
 2108            if (!success)
 109            {
 1110                return BadRequest(ApiResponse<string>.ErrorResult(error ?? "Error al registrar usuario"));
 111            }
 112
 1113            var usuarioDto = new UsuarioDto
 1114            {
 1115                Id = usuario!.Id,
 1116                Username = usuario.Username,
 1117                Estado = usuario.Estado,
 1118                PersonaId = usuario.PersonaId
 1119            };
 120
 1121            return Ok(ApiResponse<UsuarioDto>.SuccessResult(usuarioDto, "Usuario registrado exitosamente"));
 122        }
 0123        catch (Exception ex)
 124        {
 0125            _logger.LogError(ex, "Error en registro");
 0126            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 127        }
 2128    }
 129}