Files
GestionIntegralWeb/Backend/GestionIntegral.Api/Controllers/Distribucion/CambiosParadaController.cs

129 lines
6.8 KiB
C#
Raw Normal View History

using GestionIntegral.Api.Dtos.Distribucion;
using GestionIntegral.Api.Services.Distribucion;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
namespace GestionIntegral.Api.Controllers.Distribucion
{
[Route("api/canillas/{idCanilla}/paradas")] // Anidado bajo canillas
[ApiController]
[Authorize]
public class CambiosParadaController : ControllerBase
{
private readonly ICambioParadaService _paradaService;
private readonly ILogger<CambiosParadaController> _logger;
private const string PermisoGestionarParadas = "CG007";
public CambiosParadaController(ICambioParadaService paradaService, ILogger<CambiosParadaController> logger)
{
_paradaService = paradaService;
_logger = logger;
}
private bool TienePermiso(string codAcc) => User.IsInRole("SuperAdmin") || User.HasClaim(c => c.Type == "permission" && c.Value == codAcc);
private int? GetCurrentUserId()
{
if (int.TryParse(User.FindFirstValue(ClaimTypes.NameIdentifier) ?? User.FindFirstValue("sub"), out int userId)) return userId;
_logger.LogWarning("No se pudo obtener el UserId del token JWT en CambiosParadaController.");
return null;
}
// GET: api/canillas/{idCanilla}/paradas
[HttpGet]
[ProducesResponseType(typeof(IEnumerable<CambioParadaDto>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
public async Task<IActionResult> GetParadasPorCanilla(int idCanilla)
{
// Podría usarse CG001 (Ver Canilla) o CG007 para ver el historial de paradas
if (!TienePermiso("CG001") && !TienePermiso(PermisoGestionarParadas)) return Forbid();
var paradas = await _paradaService.ObtenerPorCanillaAsync(idCanilla);
return Ok(paradas);
}
// POST: api/canillas/{idCanilla}/paradas
[HttpPost]
[ProducesResponseType(typeof(CambioParadaDto), StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
public async Task<IActionResult> CreateParada(int idCanilla, [FromBody] CreateCambioParadaDto createDto)
{
if (!TienePermiso(PermisoGestionarParadas)) return Forbid();
if (!ModelState.IsValid) return BadRequest(ModelState);
var userId = GetCurrentUserId();
if (userId == null) return Unauthorized();
var (paradaDto, error) = await _paradaService.CrearNuevaParadaAsync(idCanilla, createDto, userId.Value);
if (error != null) return BadRequest(new { message = error });
if (paradaDto == null) return StatusCode(StatusCodes.Status500InternalServerError, "Error al crear la parada.");
// La ruta para "GetById" podría estar en otro controlador si decides separar los endpoints de "paradas individuales"
// Por ahora, asumimos que habrá un endpoint para obtener una parada por su ID de registro.
return CreatedAtAction(nameof(GetParadaById), new { idCanilla = idCanilla, idRegistroParada = paradaDto.IdRegistro }, paradaDto);
}
// GET: api/canillas/{idCanilla}/paradas/{idRegistroParada} (o api/paradas/{idRegistroParada})
// Este endpoint es opcional, pero útil si necesitas obtener una parada específica por su ID de registro
[HttpGet("{idRegistroParada:int}", Name = "GetParadaById")]
[ProducesResponseType(typeof(CambioParadaDto), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> GetParadaById(int idCanilla, int idRegistroParada) // idCanilla es parte de la ruta base
{
if (!TienePermiso("CG001") && !TienePermiso(PermisoGestionarParadas)) return Forbid();
var parada = await _paradaService.ObtenerPorIdAsync(idRegistroParada);
if (parada == null || parada.IdCanilla != idCanilla) return NotFound(new { message = "Registro de parada no encontrado para este canillita."});
return Ok(parada);
}
// PUT: api/paradas/{idRegistroParada}/cerrar (Ruta ejemplo para cerrar una parada)
// O podrías usar PUT api/canillas/{idCanilla}/paradas/{idRegistroParada} y que el DTO solo tenga VigenciaH
[HttpPut("~/api/paradas/{idRegistroParada}/cerrar")] // Ruta a nivel raíz para paradas si se edita por IdRegistro
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> CerrarVigenciaParada(int idRegistroParada, [FromBody] UpdateCambioParadaDto updateDto)
{
if (!TienePermiso(PermisoGestionarParadas)) return Forbid();
if (!ModelState.IsValid) return BadRequest(ModelState);
var userId = GetCurrentUserId();
if (userId == null) return Unauthorized();
var (exito, error) = await _paradaService.CerrarParadaAsync(idRegistroParada, updateDto, userId.Value);
if (!exito)
{
if (error != null && error.Contains("no encontrado")) return NotFound(new { message = error });
return BadRequest(new { message = error });
}
return NoContent();
}
// DELETE: api/paradas/{idRegistroParada}
[HttpDelete("~/api/paradas/{idRegistroParada}")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> DeleteParada(int idRegistroParada)
{
if (!TienePermiso(PermisoGestionarParadas)) return Forbid();
var userId = GetCurrentUserId();
if (userId == null) return Unauthorized();
var (exito, error) = await _paradaService.EliminarParadaAsync(idRegistroParada, userId.Value);
if (!exito)
{
if (error != null && error.Contains("no encontrado")) return NotFound(new { message = error });
return BadRequest(new { message = error });
}
return NoContent();
}
}
}