155 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			155 lines
		
	
	
		
			5.5 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 MemoriasRamController : ControllerBase | ||
|  |   { | ||
|  |     private readonly DapperContext _context; | ||
|  | 
 | ||
|  |     public MemoriasRamController(DapperContext context) | ||
|  |     { | ||
|  |       _context = context; | ||
|  |     } | ||
|  | 
 | ||
|  |     // --- GET /api/memoriasram --- | ||
|  |     [HttpGet] | ||
|  |     public async Task<IActionResult> Consultar() | ||
|  |     { | ||
|  |       var query = "SELECT Id, part_number as PartNumber, Fabricante, Tamano, Velocidad FROM dbo.memorias_ram;"; | ||
|  |       using (var connection = _context.CreateConnection()) | ||
|  |       { | ||
|  |         var memorias = await connection.QueryAsync<MemoriaRam>(query); | ||
|  |         return Ok(memorias); | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  |     // --- GET /api/memoriasram/{id} --- | ||
|  |     [HttpGet("{id}")] | ||
|  |     public async Task<IActionResult> 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<MemoriaRam>(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<IActionResult> Ingresar([FromBody] List<MemoriaRam> 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<object>(); | ||
|  | 
 | ||
|  |       using (var connection = _context.CreateConnection()) | ||
|  |       { | ||
|  |         foreach (var memoria in memorias) | ||
|  |         { | ||
|  |           var existente = await connection.QuerySingleOrDefaultAsync<MemoriaRam>(queryCheck, memoria); | ||
|  | 
 | ||
|  |           if (existente == null) | ||
|  |           { | ||
|  |             var nuevoId = await connection.ExecuteScalarAsync<int>(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<IActionResult> 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<IActionResult> 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 | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | } |