123 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			123 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | 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<IActionResult> 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<Usuario>(query); | ||
|  |         return Ok(usuarios); | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  |     // --- GET /api/usuarios/{id} --- | ||
|  |     [HttpGet("{id}")] | ||
|  |     public async Task<IActionResult> 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<Usuario>(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<IActionResult> Ingresar([FromBody] Usuario usuario) | ||
|  |     { | ||
|  |       var findQuery = "SELECT * FROM dbo.usuarios WHERE Username = @Username;"; | ||
|  |       using (var connection = _context.CreateConnection()) | ||
|  |       { | ||
|  |         var usuarioExistente = await connection.QuerySingleOrDefaultAsync<Usuario>(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<Usuario>(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<int>(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<IActionResult> 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<IActionResult> 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 | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | } |