using Dapper; using Inventario.API.Data; using Inventario.API.Models; using Microsoft.AspNetCore.Mvc; namespace Inventario.API.Controllers { [ApiController] [Route("api/[controller]")] public class SectoresController : ControllerBase { private readonly DapperContext _context; public SectoresController(DapperContext context) { _context = context; } // --- GET /api/sectores --- // Método para obtener todos los sectores. [HttpGet] public async Task ConsultarSectores() { var query = "SELECT Id, Nombre FROM dbo.sectores ORDER BY Nombre;"; using (var connection = _context.CreateConnection()) { var sectores = await connection.QueryAsync(query); return Ok(sectores); } } // --- GET /api/sectores/{id} --- // Método para obtener un único sector por su ID. [HttpGet("{id}")] public async Task ConsultarSectorDetalle(int id) { var query = "SELECT Id, Nombre FROM dbo.sectores WHERE Id = @Id;"; using (var connection = _context.CreateConnection()) { // QuerySingleOrDefaultAsync es perfecto para obtener un solo registro. // Devuelve el objeto si lo encuentra, o null si no existe. var sector = await connection.QuerySingleOrDefaultAsync(query, new { Id = id }); if (sector == null) { // Si no se encuentra, devolvemos un error HTTP 404 Not Found. return NotFound(); } return Ok(sector); } } // --- POST /api/sectores --- // Método para crear un nuevo sector. // Nota: Cambiado de /:nombre a un POST estándar que recibe el objeto en el body. Es más RESTful. [HttpPost] public async Task IngresarSector([FromBody] Sector sector) { var checkQuery = "SELECT COUNT(1) FROM dbo.sectores WHERE Nombre = @Nombre;"; var insertQuery = "INSERT INTO dbo.sectores (Nombre) VALUES (@Nombre); SELECT CAST(SCOPE_IDENTITY() as int);"; using (var connection = _context.CreateConnection()) { // Primero, verificamos si ya existe un sector con ese nombre. var existe = await connection.ExecuteScalarAsync(checkQuery, new { sector.Nombre }); if (existe) { // Si ya existe, devolvemos un error HTTP 409 Conflict. return Conflict($"Ya existe un sector con el nombre '{sector.Nombre}'"); } // ExecuteScalarAsync ejecuta la consulta y devuelve el primer valor de la primera fila (el nuevo ID). var nuevoId = await connection.ExecuteScalarAsync(insertQuery, new { sector.Nombre }); var nuevoSector = new Sector { Id = nuevoId, Nombre = sector.Nombre }; // Devolvemos una respuesta HTTP 201 Created, con la ubicación del nuevo recurso y el objeto creado. return CreatedAtAction(nameof(ConsultarSectorDetalle), new { id = nuevoId }, nuevoSector); } } // --- PUT /api/sectores/{id} --- // Método para actualizar un sector existente. [HttpPut("{id}")] public async Task ActualizarSector(int id, [FromBody] Sector sector) { var query = "UPDATE dbo.sectores SET Nombre = @Nombre WHERE Id = @Id;"; using (var connection = _context.CreateConnection()) { // ExecuteAsync devuelve el número de filas afectadas. var filasAfectadas = await connection.ExecuteAsync(query, new { Nombre = sector.Nombre, Id = id }); if (filasAfectadas == 0) { // Si no se afectó ninguna fila, significa que el ID no existía. return NotFound(); } // Devolvemos HTTP 204 No Content para indicar que la actualización fue exitosa pero no hay nada que devolver. return NoContent(); } } // --- DELETE /api/sectores/{id} --- // Método para eliminar un sector. [HttpDelete("{id}")] public async Task BorrarSector(int id) { var query = "DELETE FROM dbo.sectores WHERE Id = @Id;"; using (var connection = _context.CreateConnection()) { var filasAfectadas = await connection.ExecuteAsync(query, new { Id = id }); if (filasAfectadas == 0) { return NotFound(); } return NoContent(); } } } }