using Dapper; using Inventario.API.Data; using Inventario.API.Models; using Microsoft.AspNetCore.Mvc; namespace Inventario.API.Controllers { [ApiController] [Route("api/[controller]")] public class UsuariosController : ControllerBase { private readonly DapperContext _context; public UsuariosController(DapperContext context) { _context = context; } // --- GET /api/usuarios --- [HttpGet] public async Task Consultar() { var query = "SELECT Id, Username, Password, Created_at, Updated_at FROM dbo.usuarios ORDER BY Username;"; using (var connection = _context.CreateConnection()) { var usuarios = await connection.QueryAsync(query); return Ok(usuarios); } } // --- GET /api/usuarios/{id} --- [HttpGet("{id}")] public async Task ConsultarDetalle(int id) { var query = "SELECT Id, Username, Password, Created_at, Updated_at FROM dbo.usuarios WHERE Id = @Id;"; using (var connection = _context.CreateConnection()) { var usuario = await connection.QuerySingleOrDefaultAsync(query, new { Id = id }); if (usuario == null) { return NotFound("Usuario no encontrado."); } return Ok(usuario); } } // --- POST /api/usuarios --- // Este endpoint replica la lógica "upsert" del original: si el usuario existe, lo actualiza; si no, lo crea. [HttpPost] public async Task Ingresar([FromBody] Usuario usuario) { var findQuery = "SELECT * FROM dbo.usuarios WHERE Username = @Username;"; using (var connection = _context.CreateConnection()) { var usuarioExistente = await connection.QuerySingleOrDefaultAsync(findQuery, new { usuario.Username }); if (usuarioExistente != null) { // El usuario ya existe, lo actualizamos (solo la contraseña si viene) var updateQuery = "UPDATE dbo.usuarios SET Password = @Password WHERE Id = @Id;"; await connection.ExecuteAsync(updateQuery, new { usuario.Password, Id = usuarioExistente.Id }); // Devolvemos el usuario actualizado var usuarioActualizado = await connection.QuerySingleOrDefaultAsync(findQuery, new { usuario.Username }); return Ok(usuarioActualizado); } else { // El usuario no existe, lo creamos var insertQuery = "INSERT INTO dbo.usuarios (Username, Password) VALUES (@Username, @Password); SELECT CAST(SCOPE_IDENTITY() as int);"; var nuevoId = await connection.ExecuteScalarAsync(insertQuery, new { usuario.Username, usuario.Password }); var nuevoUsuario = new Usuario { Id = nuevoId, Username = usuario.Username, Password = usuario.Password }; return CreatedAtAction(nameof(ConsultarDetalle), new { id = nuevoId }, nuevoUsuario); } } } // --- PUT /api/usuarios/{id} --- // Endpoint específico para actualizar la contraseña, como en el original. [HttpPut("{id}")] public async Task Actualizar(int id, [FromBody] Usuario data) { var updateQuery = "UPDATE dbo.usuarios SET Password = @Password WHERE Id = @Id;"; using (var connection = _context.CreateConnection()) { var filasAfectadas = await connection.ExecuteAsync(updateQuery, new { data.Password, Id = id }); if (filasAfectadas == 0) { return NotFound("Usuario no encontrado."); } // Para replicar la respuesta del backend original, volvemos a consultar el usuario (sin la contraseña). var selectQuery = "SELECT Id, Username FROM dbo.usuarios WHERE Id = @Id;"; var usuarioActualizado = await connection.QuerySingleOrDefaultAsync(selectQuery, new { Id = id }); return Ok(usuarioActualizado); } } // --- DELETE /api/usuarios/{id} --- [HttpDelete("{id}")] public async Task Borrar(int id) { var query = "DELETE FROM dbo.usuarios WHERE Id = @Id;"; using (var connection = _context.CreateConnection()) { var filasAfectadas = await connection.ExecuteAsync(query, new { Id = id }); if (filasAfectadas == 0) { return NotFound("Usuario no encontrado."); } return NoContent(); // Respuesta HTTP 204 No Content } } // --- GET /api/usuarios/buscar/{termino} --- [HttpGet("buscar/{termino}")] public async Task BuscarUsuarios(string termino) { // Usamos LIKE para una búsqueda flexible. El '%' son comodines. var query = "SELECT Username FROM dbo.usuarios WHERE Username LIKE @SearchTerm ORDER BY Username;"; using (var connection = _context.CreateConnection()) { var usuarios = await connection.QueryAsync(query, new { SearchTerm = $"%{termino}%" }); return Ok(usuarios); } } } }