using Dapper; using Inventario.API.Data; using Inventario.API.Models; using Microsoft.AspNetCore.Mvc; namespace Inventario.API.Controllers { [ApiController] [Route("api/[controller]")] public class MemoriasRamController : ControllerBase { private readonly DapperContext _context; public MemoriasRamController(DapperContext context) { _context = context; } // --- GET /api/memoriasram --- [HttpGet] public async Task Consultar() { var query = @" SELECT MIN(Id) as Id, MIN(part_number) as PartNumber, -- Tomamos un part_number como ejemplo para el modelo Fabricante, Tamano, Velocidad FROM dbo.memorias_ram WHERE Fabricante IS NOT NULL AND Fabricante != '' GROUP BY Fabricante, Tamano, Velocidad ORDER BY Fabricante, Tamano, Velocidad;"; using (var connection = _context.CreateConnection()) { var memorias = await connection.QueryAsync(query); return Ok(memorias); } } // --- GET /api/memoriasram/{id} --- [HttpGet("{id}")] public async Task ConsultarDetalle(int id) { var query = "SELECT Id, part_number as PartNumber, Fabricante, Tamano, Velocidad FROM dbo.memorias_ram WHERE Id = @Id;"; using (var connection = _context.CreateConnection()) { var memoria = await connection.QuerySingleOrDefaultAsync(query, new { Id = id }); if (memoria == null) { return NotFound("Módulo de memoria RAM no encontrado."); } return Ok(memoria); } } // --- POST /api/memoriasram --- [HttpPost] public async Task Ingresar([FromBody] List memorias) { // Consulta para verificar la existencia. Maneja correctamente los valores nulos. var queryCheck = @"SELECT * FROM dbo.memorias_ram WHERE (part_number = @Part_number OR (part_number IS NULL AND @Part_number IS NULL)) AND (fabricante = @Fabricante OR (fabricante IS NULL AND @Fabricante IS NULL)) AND tamano = @Tamano AND (velocidad = @Velocidad OR (velocidad IS NULL AND @Velocidad IS NULL));"; var queryInsert = @"INSERT INTO dbo.memorias_ram (part_number, fabricante, tamano, velocidad) VALUES (@Part_number, @Fabricante, @Tamano, @Velocidad); SELECT CAST(SCOPE_IDENTITY() as int);"; var resultados = new List(); using (var connection = _context.CreateConnection()) { foreach (var memoria in memorias) { var existente = await connection.QuerySingleOrDefaultAsync(queryCheck, memoria); if (existente == null) { var nuevoId = await connection.ExecuteScalarAsync(queryInsert, memoria); var nuevaMemoria = new MemoriaRam { Id = nuevoId, Part_number = memoria.Part_number, Fabricante = memoria.Fabricante, Tamano = memoria.Tamano, Velocidad = memoria.Velocidad }; resultados.Add(new { action = "created", registro = nuevaMemoria }); } else { resultados.Add(new { action = "exists", registro = existente }); } } } return Ok(resultados); } // --- PUT /api/memoriasram/{id} --- [HttpPut("{id}")] public async Task Actualizar(int id, [FromBody] MemoriaRam memoria) { var query = @"UPDATE dbo.memorias_ram SET part_number = @Part_number, fabricante = @Fabricante, tamano = @Tamano, velocidad = @Velocidad WHERE Id = @Id;"; using (var connection = _context.CreateConnection()) { var filasAfectadas = await connection.ExecuteAsync(query, new { memoria.Part_number, memoria.Fabricante, memoria.Tamano, memoria.Velocidad, Id = id }); if (filasAfectadas == 0) { return NotFound("Módulo de memoria RAM no encontrado."); } memoria.Id = id; return Ok(memoria); } } // --- DELETE /api/memoriasram/{id} --- [HttpDelete("{id}")] public async Task Borrar(int id) { var deleteAssociationsQuery = "DELETE FROM dbo.equipos_memorias_ram WHERE memoria_ram_id = @Id;"; var deleteRamQuery = "DELETE FROM dbo.memorias_ram WHERE Id = @Id;"; using (var connection = _context.CreateConnection()) { connection.Open(); using (var transaction = connection.BeginTransaction()) { try { // Primero eliminamos las asociaciones en la tabla intermedia await connection.ExecuteAsync(deleteAssociationsQuery, new { Id = id }, transaction: transaction); // Luego eliminamos el módulo de RAM var filasAfectadas = await connection.ExecuteAsync(deleteRamQuery, new { Id = id }, transaction: transaction); if (filasAfectadas == 0) { // Si no se borró nada, hacemos rollback y devolvemos NotFound. transaction.Rollback(); return NotFound("Módulo de memoria RAM no encontrado."); } // Si todo salió bien, confirmamos la transacción. transaction.Commit(); return NoContent(); } catch { transaction.Rollback(); throw; // Relanza la excepción para que sea manejada por el middleware de errores de ASP.NET Core } } } } // --- GET /api/memoriasram/buscar/{termino} --- [HttpGet("buscar/{termino}")] public async Task BuscarMemoriasRam(string termino) { var query = @"SELECT Id, part_number as PartNumber, Fabricante, Tamano, Velocidad FROM dbo.memorias_ram WHERE Fabricante LIKE @SearchTerm OR part_number LIKE @SearchTerm ORDER BY Fabricante, Tamano;"; using (var connection = _context.CreateConnection()) { var memorias = await connection.QueryAsync(query, new { SearchTerm = $"%{termino}%" }); return Ok(memorias); } } } }