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
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| } |