< Summary

Information
Class: FAU.API.Controllers.RolesController
Assembly: FAU.API
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.API/Controllers/RolesController.cs
Line coverage
86%
Covered lines: 63
Uncovered lines: 10
Coverable lines: 73
Total lines: 196
Line coverage: 86.3%
Branch coverage
57%
Covered branches: 15
Total branches: 26
Branch coverage: 57.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%
GetRoles()100%11100%
CreateRol()60%111081.81%
GetRol()100%22100%
UpdateRol()50%201468.42%

File(s)

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

#LineLine coverage
 1using FAU.Logica.DTOs;
 2using FAU.Logica.Services;
 3using FAU.Entidades;
 4using Microsoft.AspNetCore.Authorization;
 5using Microsoft.AspNetCore.Http;
 6using Microsoft.AspNetCore.Mvc;
 7
 8namespace FAU.API.Controllers;
 9
 10/// <summary>
 11/// Gestión de roles del sistema
 12/// </summary>
 13[ApiController]
 14[Route("api/[controller]")]
 15[Produces("application/json")]
 16public class RolesController : ControllerBase
 17{
 18    private readonly IRolService _rolService;
 19    private readonly ILogger<RolesController> _logger;
 20
 1121    public RolesController(
 1122        IRolService rolService,
 1123        ILogger<RolesController> logger)
 24    {
 1125        _rolService = rolService;
 1126        _logger = logger;
 1127    }
 28
 29    /// <summary>
 30    /// Listar todos los roles
 31    /// GET /api/roles
 32    /// </summary>
 33    [HttpGet]
 34    [Authorize(Roles = "Administrador")]
 35    [ProducesResponseType(typeof(ApiResponse<object>), StatusCodes.Status200OK)]
 36    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 37    public async Task<IActionResult> GetRoles()
 38    {
 39        try
 40        {
 241            var roles = await _rolService.GetAllAsync();
 42
 343            var rolesDto = roles.Select(r => new
 344            {
 345                id = r.Id,
 346                nombre = r.Nombre,
 347                descripcion = r.Descripcion
 348            }).ToList();
 49
 150            return Ok(ApiResponse<object>.SuccessResult(rolesDto));
 51        }
 152        catch (Exception ex)
 53        {
 154            _logger.LogError(ex, "Error al obtener roles");
 155            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 56        }
 257    }
 58
 59    /// <summary>
 60    /// Crear rol
 61    /// POST /api/roles
 62    /// </summary>
 63    [HttpPost]
 64    [Authorize(Roles = "Administrador")]
 65    [ProducesResponseType(typeof(ApiResponse<object>), StatusCodes.Status201Created)]
 66    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status400BadRequest)]
 67    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status409Conflict)]
 68    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 69    public async Task<IActionResult> CreateRol([FromBody] CreateRolRequest request)
 70    {
 71        try
 72        {
 373            if (string.IsNullOrWhiteSpace(request.Nombre))
 74            {
 175                return BadRequest(ApiResponse<string>.ErrorResult("El nombre del rol es requerido"));
 76            }
 77
 278            var (success, rol, error) = await _rolService.CreateAsync(
 279                request.Nombre,
 280                request.Descripcion);
 81
 282            if (!success)
 83            {
 184                if (error?.Contains("ya existe") == true)
 85                {
 186                    return Conflict(ApiResponse<string>.ErrorResult(error));
 87                }
 088                return BadRequest(ApiResponse<string>.ErrorResult(error ?? "Error al crear rol"));
 89            }
 90
 191            var response = new
 192            {
 193                id = rol!.Id,
 194                creado = true
 195            };
 96
 197            return CreatedAtAction(
 198                nameof(GetRol),
 199                new { id = rol.Id },
 1100                ApiResponse<object>.SuccessResult(response, "Rol creado exitosamente"));
 101        }
 0102        catch (Exception ex)
 103        {
 0104            _logger.LogError(ex, "Error al crear rol");
 0105            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 106        }
 3107    }
 108
 109    /// <summary>
 110    /// Obtener rol por ID
 111    /// GET /api/roles/{id}
 112    /// </summary>
 113    [HttpGet("{id}")]
 114    [Authorize(Roles = "Administrador")]
 115    [ProducesResponseType(typeof(ApiResponse<object>), StatusCodes.Status200OK)]
 116    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status404NotFound)]
 117    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 118    public async Task<IActionResult> GetRol(long id)
 119    {
 120        try
 121        {
 3122            var rol = await _rolService.GetByIdAsync(id);
 123
 2124            if (rol == null)
 125            {
 1126                return NotFound(ApiResponse<string>.ErrorResult("Rol no encontrado"));
 127            }
 128
 1129            var response = new
 1130            {
 1131                id = rol.Id,
 1132                nombre = rol.Nombre,
 1133                descripcion = rol.Descripcion
 1134            };
 135
 1136            return Ok(ApiResponse<object>.SuccessResult(response));
 137        }
 1138        catch (Exception ex)
 139        {
 1140            _logger.LogError(ex, "Error al obtener rol {Id}", id);
 1141            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 142        }
 3143    }
 144
 145    /// <summary>
 146    /// Editar rol
 147    /// PUT /api/roles/{id}
 148    /// </summary>
 149    [HttpPut("{id}")]
 150    [Authorize(Roles = "Administrador")]
 151    [ProducesResponseType(typeof(ApiResponse<object>), StatusCodes.Status200OK)]
 152    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status400BadRequest)]
 153    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status404NotFound)]
 154    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status409Conflict)]
 155    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 156    public async Task<IActionResult> UpdateRol(long id, [FromBody] UpdateRolRequest request)
 157    {
 158        try
 159        {
 3160            if (id != request.Id)
 161            {
 1162                return BadRequest(ApiResponse<string>.ErrorResult("El ID del rol no coincide"));
 163            }
 164
 2165            var rolExistente = await _rolService.GetByIdAsync(id);
 2166            if (rolExistente == null)
 167            {
 1168                return NotFound(ApiResponse<string>.ErrorResult("Rol no encontrado"));
 169            }
 170
 1171            if (!string.IsNullOrWhiteSpace(request.Nombre))
 172            {
 1173                var (success, rol, error) = await _rolService.UpdateAsync(
 1174                    request.Id,
 1175                    request.Nombre,
 1176                    request.Descripcion);
 177
 1178                if (!success)
 179                {
 0180                    if (error?.Contains("ya existe") == true)
 181                    {
 0182                        return Conflict(ApiResponse<string>.ErrorResult(error));
 183                    }
 0184                    return BadRequest(ApiResponse<string>.ErrorResult(error ?? "Error al actualizar rol"));
 185                }
 186            }
 187
 1188            return Ok(ApiResponse<object>.SuccessResult(new { actualizado = true }, "Rol actualizado exitosamente"));
 189        }
 0190        catch (Exception ex)
 191        {
 0192            _logger.LogError(ex, "Error al actualizar rol {Id}", id);
 0193            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 194        }
 3195    }
 196}