< Summary

Information
Class: FAU.API.Controllers.BeneficiosSocialesBeneficiariosController
Assembly: FAU.API
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.API/Controllers/BeneficiosSocialesBeneficiariosController.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 107
Coverable lines: 107
Total lines: 234
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 38
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
Listar()100%210%
Obtener()0%2040%
Agregar()0%620%
Actualizar()0%2040%
Eliminar()0%2040%
SubirDocumento()0%7280%
ListarDocumentos()0%2040%
EliminarDocumento()0%2040%
DescargarDocumento()0%4260%
ObtenerUsuarioId()0%620%

File(s)

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

#LineLine coverage
 1using System.Security.Claims;
 2using FAU.Logica.DTOs;
 3using FAU.Logica.Services;
 4using Microsoft.AspNetCore.Authorization;
 5using Microsoft.AspNetCore.Mvc;
 6
 7namespace FAU.API.Controllers;
 8
 9[ApiController]
 10[Route("api/beneficios-sociales/{beneficioId:long}/beneficiarios")]
 11[Authorize(Roles = "Administrador,Supervisor")]
 12public class BeneficiosSocialesBeneficiariosController : ControllerBase
 13{
 14    private readonly IBeneficioSocialBeneficiarioService _service;
 15    private readonly ILogger<BeneficiosSocialesBeneficiariosController> _logger;
 16
 017    public BeneficiosSocialesBeneficiariosController(
 018        IBeneficioSocialBeneficiarioService service,
 019        ILogger<BeneficiosSocialesBeneficiariosController> logger)
 20    {
 021        _service = service;
 022        _logger  = logger;
 023    }
 24
 25    [HttpGet]
 26    public async Task<IActionResult> Listar(long beneficioId, [FromQuery] bool soloActivos = true)
 27    {
 28        try
 29        {
 030            var items = await _service.ObtenerPorBeneficioAsync(beneficioId, soloActivos);
 031            return Ok(ApiResponse<object>.SuccessResult(items));
 32        }
 033        catch (Exception ex)
 34        {
 035            _logger.LogError(ex, "Error al listar beneficiarios del beneficio {BeneficioId}", beneficioId);
 036            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 37        }
 038    }
 39
 40    [HttpGet("{id:long}")]
 41    public async Task<IActionResult> Obtener(long beneficioId, long id)
 42    {
 43        try
 44        {
 045            var item = await _service.ObtenerPorIdAsync(id);
 046            if (item is null || item.BeneficioId != beneficioId)
 047                return NotFound(ApiResponse<string>.ErrorResult("Beneficiario no encontrado"));
 048            return Ok(ApiResponse<object>.SuccessResult(item));
 49        }
 050        catch (Exception ex)
 51        {
 052            _logger.LogError(ex, "Error al obtener beneficiario {Id}", id);
 053            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 54        }
 055    }
 56
 57    [HttpPost]
 58    public async Task<IActionResult> Agregar(long beneficioId, [FromBody] CrearBeneficiarioSocialRequest request)
 59    {
 060        if (!ModelState.IsValid)
 061            return BadRequest(ApiResponse<string>.ErrorResult("Datos inválidos"));
 62
 63        try
 64        {
 065            var usuarioId = ObtenerUsuarioId();
 066            var creado = await _service.AgregarAsync(beneficioId, request, usuarioId);
 067            return CreatedAtAction(nameof(Obtener),
 068                new { beneficioId, id = creado.Id },
 069                ApiResponse<object>.SuccessResult(creado, "Beneficiario agregado correctamente"));
 70        }
 071        catch (ArgumentException ex)
 72        {
 073            return BadRequest(ApiResponse<string>.ErrorResult(ex.Message));
 74        }
 075        catch (InvalidOperationException ex)
 76        {
 077            return Conflict(ApiResponse<string>.ErrorResult(ex.Message));
 78        }
 079        catch (Exception ex)
 80        {
 081            _logger.LogError(ex, "Error al agregar beneficiario al beneficio {BeneficioId}", beneficioId);
 082            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 83        }
 084    }
 85
 86    [HttpPut("{id:long}")]
 87    public async Task<IActionResult> Actualizar(
 88        long beneficioId, long id, [FromBody] ActualizarBeneficiarioSocialRequest request)
 89    {
 90        try
 91        {
 092            var item = await _service.ObtenerPorIdAsync(id);
 093            if (item is null || item.BeneficioId != beneficioId)
 094                return NotFound(ApiResponse<string>.ErrorResult("Beneficiario no encontrado"));
 95
 096            var actualizado = await _service.ActualizarAsync(id, request);
 097            return Ok(ApiResponse<object>.SuccessResult(actualizado, "Beneficiario actualizado correctamente"));
 98        }
 099        catch (ArgumentException ex)
 100        {
 0101            return BadRequest(ApiResponse<string>.ErrorResult(ex.Message));
 102        }
 0103        catch (Exception ex)
 104        {
 0105            _logger.LogError(ex, "Error al actualizar beneficiario {Id}", id);
 0106            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 107        }
 0108    }
 109
 110    [HttpDelete("{id:long}")]
 111    public async Task<IActionResult> Eliminar(long beneficioId, long id)
 112    {
 113        try
 114        {
 0115            var item = await _service.ObtenerPorIdAsync(id);
 0116            if (item is null || item.BeneficioId != beneficioId)
 0117                return NotFound(ApiResponse<string>.ErrorResult("Beneficiario no encontrado"));
 118
 0119            await _service.EliminarAsync(id);
 0120            return Ok(ApiResponse<string>.SuccessResult("ok", "Beneficiario eliminado correctamente"));
 121        }
 0122        catch (ArgumentException ex)
 123        {
 0124            return BadRequest(ApiResponse<string>.ErrorResult(ex.Message));
 125        }
 0126        catch (Exception ex)
 127        {
 0128            _logger.LogError(ex, "Error al eliminar beneficiario {Id}", id);
 0129            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 130        }
 0131    }
 132
 133    [HttpPost("{id:long}/documentos")]
 134    public async Task<IActionResult> SubirDocumento(long beneficioId, long id, IFormFile archivo)
 135    {
 0136        if (archivo is null || archivo.Length == 0)
 0137            return BadRequest(ApiResponse<string>.ErrorResult("Debe adjuntar un archivo"));
 138
 139        try
 140        {
 0141            var item = await _service.ObtenerPorIdAsync(id);
 0142            if (item is null || item.BeneficioId != beneficioId)
 0143                return NotFound(ApiResponse<string>.ErrorResult("Beneficiario no encontrado"));
 144
 0145            var usuarioId = ObtenerUsuarioId();
 0146            using var stream = archivo.OpenReadStream();
 0147            var ruta = await _service.SubirDocumentoAsync(id, stream, archivo.FileName, archivo.ContentType, usuarioId);
 0148            return Ok(ApiResponse<object>.SuccessResult(new { ruta }, "Documento subido correctamente"));
 149        }
 0150        catch (ArgumentException ex)
 151        {
 0152            return BadRequest(ApiResponse<string>.ErrorResult(ex.Message));
 153        }
 0154        catch (Exception ex)
 155        {
 0156            _logger.LogError(ex, "Error al subir documento para beneficiario {Id}", id);
 0157            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 158        }
 0159    }
 160
 161    [HttpGet("{id:long}/documentos")]
 162    public async Task<IActionResult> ListarDocumentos(long beneficioId, long id)
 163    {
 164        try
 165        {
 0166            var item = await _service.ObtenerPorIdAsync(id);
 0167            if (item is null || item.BeneficioId != beneficioId)
 0168                return NotFound(ApiResponse<string>.ErrorResult("Beneficiario no encontrado"));
 169
 0170            var docs = await _service.ObtenerDocumentosAsync(id);
 0171            return Ok(ApiResponse<object>.SuccessResult(docs));
 172        }
 0173        catch (Exception ex)
 174        {
 0175            _logger.LogError(ex, "Error al listar documentos del beneficiario {Id}", id);
 0176            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 177        }
 0178    }
 179
 180    [HttpDelete("{id:long}/documentos/{docId:long}")]
 181    public async Task<IActionResult> EliminarDocumento(long beneficioId, long id, long docId)
 182    {
 183        try
 184        {
 0185            var item = await _service.ObtenerPorIdAsync(id);
 0186            if (item is null || item.BeneficioId != beneficioId)
 0187                return NotFound(ApiResponse<string>.ErrorResult("Beneficiario no encontrado"));
 188
 0189            await _service.EliminarDocumentoAsync(id, docId);
 0190            return Ok(ApiResponse<string>.SuccessResult("ok", "Documento eliminado correctamente"));
 191        }
 0192        catch (KeyNotFoundException)
 193        {
 0194            return NotFound(ApiResponse<string>.ErrorResult("Documento no encontrado"));
 195        }
 0196        catch (Exception ex)
 197        {
 0198            _logger.LogError(ex, "Error al eliminar documento {DocId} del beneficiario {Id}", docId, id);
 0199            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 200        }
 0201    }
 202
 203    [HttpGet("{id:long}/documentos/{docId:long}")]
 204    public async Task<IActionResult> DescargarDocumento(
 205        long beneficioId, long id, long docId, [FromQuery] bool inline = false)
 206    {
 207        try
 208        {
 0209            var item = await _service.ObtenerPorIdAsync(id);
 0210            if (item is null || item.BeneficioId != beneficioId)
 0211                return NotFound(ApiResponse<string>.ErrorResult("Beneficiario no encontrado"));
 212
 0213            var (stream, nombre, contentType) = await _service.DescargarDocumentoAsync(id, docId);
 0214            var disposition = inline ? "inline" : "attachment";
 0215            Response.Headers.Append("Content-Disposition", $"{disposition}; filename=\"{nombre}\"");
 0216            return File(stream, contentType);
 217        }
 0218        catch (KeyNotFoundException)
 219        {
 0220            return NotFound(ApiResponse<string>.ErrorResult("Documento no encontrado"));
 221        }
 0222        catch (Exception ex)
 223        {
 0224            _logger.LogError(ex, "Error al descargar documento {DocId} del beneficiario {Id}", docId, id);
 0225            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 226        }
 0227    }
 228
 229    private long ObtenerUsuarioId()
 230    {
 0231        var claim = User.FindFirstValue(ClaimTypes.NameIdentifier);
 0232        return long.TryParse(claim, out var id) ? id : 0;
 233    }
 234}