< Summary

Information
Class: FAU.API.Controllers.GradosController
Assembly: FAU.API
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.API/Controllers/GradosController.cs
Line coverage
72%
Covered lines: 26
Uncovered lines: 10
Coverable lines: 36
Total lines: 115
Line coverage: 72.2%
Branch coverage
50%
Covered branches: 10
Total branches: 20
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
ObtenerGrados()100%11100%
CrearGrado()75%10866.66%
ActualizarGrado()33.33%231257.14%

File(s)

/home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.API/Controllers/GradosController.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[ApiController]
 10[Route("api/[controller]")]
 11[Authorize]
 12[Produces("application/json")]
 13public class GradosController : ControllerBase
 14{
 15    private readonly IGradoService _gradoService;
 16    private readonly ILogger<GradosController> _logger;
 17
 718    public GradosController(IGradoService gradoService, ILogger<GradosController> logger)
 19    {
 720        _gradoService = gradoService;
 721        _logger = logger;
 722    }
 23
 24    /// <summary>
 25    /// Listar todos los grados vigentes
 26    /// GET /api/grados
 27    /// </summary>
 28    [HttpGet]
 29    [ProducesResponseType(typeof(ApiResponse<IEnumerable<GradoDto>>), StatusCodes.Status200OK)]
 30    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 31    public async Task<IActionResult> ObtenerGrados()
 32    {
 33        try
 34        {
 335            var grados = await _gradoService.ObtenerTodosAsync();
 236            return Ok(ApiResponse<IEnumerable<GradoDto>>.SuccessResult(grados));
 37        }
 138        catch (Exception ex)
 39        {
 140            _logger.LogError(ex, "Error al obtener grados");
 141            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 42        }
 343    }
 44
 45    /// <summary>
 46    /// Crear un nuevo grado
 47    /// POST /api/grados
 48    /// </summary>
 49    [HttpPost]
 50    [Authorize(Roles = "Administrador")]
 51    [ProducesResponseType(typeof(ApiResponse<GradoDto>), StatusCodes.Status201Created)]
 52    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status400BadRequest)]
 53    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status409Conflict)]
 54    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 55    public async Task<IActionResult> CrearGrado([FromBody] CrearGradoRequest request)
 56    {
 57        try
 58        {
 259            var (exito, resultado, error) = await _gradoService.CrearAsync(
 260                request.Codigo, request.Denominacion, request.Orden,
 261                request.EscalafonId, request.EsOficial, request.EsSubalterno, request.Vigente);
 62
 263            if (!exito)
 64            {
 165                if (error?.Contains("ya existe", StringComparison.OrdinalIgnoreCase) == true)
 066                    return Conflict(ApiResponse<string>.ErrorResult(error));
 167                return BadRequest(ApiResponse<string>.ErrorResult(error ?? "Error al crear grado"));
 68            }
 69
 170            return CreatedAtAction(nameof(ObtenerGrados), ApiResponse<GradoDto>.SuccessResult(resultado!, "Grado creado 
 71        }
 072        catch (Exception ex)
 73        {
 074            _logger.LogError(ex, "Error al crear grado");
 075            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 76        }
 277    }
 78
 79    /// <summary>
 80    /// Actualizar un grado existente
 81    /// PUT /api/grados/{id}
 82    /// </summary>
 83    [HttpPut("{id}")]
 84    [Authorize(Roles = "Administrador")]
 85    [ProducesResponseType(typeof(ApiResponse<GradoDto>), StatusCodes.Status200OK)]
 86    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status400BadRequest)]
 87    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status404NotFound)]
 88    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status409Conflict)]
 89    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 90    public async Task<IActionResult> ActualizarGrado(long id, [FromBody] ActualizarGradoRequest request)
 91    {
 92        try
 93        {
 294            var (exito, resultado, error) = await _gradoService.ActualizarAsync(
 295                id, request.Codigo, request.Denominacion, request.Orden,
 296                request.EscalafonId, request.EsOficial, request.EsSubalterno, request.Vigente);
 97
 298            if (!exito)
 99            {
 1100                if (error?.Contains("no encontrado", StringComparison.OrdinalIgnoreCase) == true)
 1101                    return NotFound(ApiResponse<string>.ErrorResult(error));
 0102                if (error?.Contains("ya existe", StringComparison.OrdinalIgnoreCase) == true)
 0103                    return Conflict(ApiResponse<string>.ErrorResult(error));
 0104                return BadRequest(ApiResponse<string>.ErrorResult(error ?? "Error al actualizar grado"));
 105            }
 106
 1107            return Ok(ApiResponse<GradoDto>.SuccessResult(resultado!, "Grado actualizado exitosamente"));
 108        }
 0109        catch (Exception ex)
 110        {
 0111            _logger.LogError(ex, "Error al actualizar grado {Id}", id);
 0112            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 113        }
 2114    }
 115}