< Summary

Information
Class: FAU.API.Controllers.AuditoriaController
Assembly: FAU.API
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.API/Controllers/AuditoriaController.cs
Line coverage
100%
Covered lines: 18
Uncovered lines: 0
Coverable lines: 18
Total lines: 58
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GetAllBitacorasAsync()100%11100%

File(s)

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

#LineLine coverage
 1using FAU.Logica.DTOs;
 2using FAU.Logica.Services;
 3using Microsoft.AspNetCore.Authorization;
 4using Microsoft.AspNetCore.Mvc;
 5using FAU.Entidades;
 6
 7namespace FAU.API.Controllers;
 8
 9/// <summary>
 10/// Controlador de auditoría
 11/// </summary>
 12[ApiController]
 13[Route("api/[controller]")]
 14public class AuditoriaController : ControllerBase
 15{
 16    private readonly IAuditoriaService _auditoriaService;
 17    private readonly ILogger<AuditoriaController> _logger;
 18
 219    public AuditoriaController(IAuditoriaService auditoriaService, ILogger<AuditoriaController> logger)
 20    {
 221        _auditoriaService = auditoriaService;
 222        _logger = logger;
 223    }
 24
 25    /// <summary>
 26    /// Obtiene todas las entradas de la bitácora de auditoría
 27    /// </summary>
 28    [HttpGet("auditoria")]
 29    [Authorize(Roles = "Administrador")]
 30    public async Task<IActionResult> GetAllBitacorasAsync()
 31    {
 32        try
 33        {
 234            var bitacoras = await _auditoriaService.GetAllAsync();
 35            /*
 36            Seteo el DTO ya que el entity framework tiene referencias circulares con usuario
 37            b1.Usuario -> u1
 38            u1.BitacorasAuditoria -> [b1, b2, ...]
 39            b1.Usuario apunta otra vez a u1 → ciclo.
 40            Entonces al serializar a JSON estaria en un ciclo infinito.
 41            */
 142            var dtos = bitacoras.Select(b => new BitacoraDto {
 143                Id = b.Id,
 144                UsuarioNombre = b.Usuario.Username,
 145                AccionNombre = b.Accion.Nombre,
 146                ContextoNombre = b.Contexto.Nombre,
 147                Host = b.Host,
 148                Fecha = b.Fecha
 149            });
 150            return Ok(ApiResponse<IEnumerable<BitacoraDto>>.SuccessResult(dtos, "Bitácoras obtenidas correctamente"));
 51        }
 152        catch (Exception ex)
 53        {
 154            _logger.LogError(ex, "Error al obtener la auditoría");
 155            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 56        }
 257    }
 58}