feat: Complete API endpoints for grains and cattle data
This commit is contained in:
		| @@ -9,15 +9,60 @@ namespace Mercados.Api.Controllers | |||||||
|     public class MercadosController : ControllerBase |     public class MercadosController : ControllerBase | ||||||
|     { |     { | ||||||
|         private readonly ICotizacionBolsaRepository _bolsaRepo; |         private readonly ICotizacionBolsaRepository _bolsaRepo; | ||||||
|  |         private readonly ICotizacionGranoRepository _granoRepo; | ||||||
|  |         private readonly ICotizacionGanadoRepository _ganadoRepo; | ||||||
|         private readonly ILogger<MercadosController> _logger; |         private readonly ILogger<MercadosController> _logger; | ||||||
|          |          | ||||||
|         // Inyectamos los repositorios que este controlador necesita. |         // Inyectamos TODOS los repositorios que necesita el controlador. | ||||||
|         public MercadosController(ICotizacionBolsaRepository bolsaRepo, ILogger<MercadosController> logger) |         public MercadosController( | ||||||
|  |             ICotizacionBolsaRepository bolsaRepo,  | ||||||
|  |             ICotizacionGranoRepository granoRepo,  | ||||||
|  |             ICotizacionGanadoRepository ganadoRepo,  | ||||||
|  |             ILogger<MercadosController> logger) | ||||||
|         { |         { | ||||||
|             _bolsaRepo = bolsaRepo; |             _bolsaRepo = bolsaRepo; | ||||||
|  |             _granoRepo = granoRepo; | ||||||
|  |             _ganadoRepo = ganadoRepo; | ||||||
|             _logger = logger; |             _logger = logger; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         // --- Endpoint para Agroganadero --- | ||||||
|  |         [HttpGet("agroganadero")] | ||||||
|  |         [ProducesResponseType(typeof(IEnumerable<CotizacionGanado>), StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> GetAgroganadero() | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 var data = await _ganadoRepo.ObtenerUltimaTandaAsync(); | ||||||
|  |                 return Ok(data); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 _logger.LogError(ex, "Error al obtener cotizaciones de agroganadero."); | ||||||
|  |                 return StatusCode(500, "Ocurrió un error interno en el servidor."); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // --- Endpoint para Granos --- | ||||||
|  |         [HttpGet("granos")] | ||||||
|  |         [ProducesResponseType(typeof(IEnumerable<CotizacionGrano>), StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> GetGranos() | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 var data = await _granoRepo.ObtenerUltimasAsync(); | ||||||
|  |                 return Ok(data); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 _logger.LogError(ex, "Error al obtener cotizaciones de granos."); | ||||||
|  |                 return StatusCode(500, "Ocurrió un error interno en el servidor."); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // --- Endpoints de Bolsa --- | ||||||
|         [HttpGet("bolsa/eeuu")] |         [HttpGet("bolsa/eeuu")] | ||||||
|         [ProducesResponseType(typeof(IEnumerable<CotizacionBolsa>), StatusCodes.Status200OK)] |         [ProducesResponseType(typeof(IEnumerable<CotizacionBolsa>), StatusCodes.Status200OK)] | ||||||
|         [ProducesResponseType(StatusCodes.Status500InternalServerError)] |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
| @@ -51,7 +96,5 @@ namespace Mercados.Api.Controllers | |||||||
|                 return StatusCode(500, "Ocurrió un error interno en el servidor."); |                 return StatusCode(500, "Ocurrió un error interno en el servidor."); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|          |  | ||||||
|         // NOTA: Añadiremos los endpoints para Granos y Ganado en un momento. |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -30,5 +30,18 @@ namespace Mercados.Infrastructure.Persistence.Repositories | |||||||
|  |  | ||||||
|             await connection.ExecuteAsync(sql, cotizaciones); |             await connection.ExecuteAsync(sql, cotizaciones); | ||||||
|         } |         } | ||||||
|  |         public async Task<IEnumerable<CotizacionGanado>> ObtenerUltimaTandaAsync() | ||||||
|  |         { | ||||||
|  |             using IDbConnection connection = _connectionFactory.CreateConnection(); | ||||||
|  |  | ||||||
|  |             // Primero, obtenemos la fecha de registro más reciente. | ||||||
|  |             // Luego, seleccionamos todos los registros que tengan esa fecha. | ||||||
|  |             const string sql = @" | ||||||
|  |                 SELECT *  | ||||||
|  |                 FROM CotizacionesGanado  | ||||||
|  |                 WHERE FechaRegistro = (SELECT MAX(FechaRegistro) FROM CotizacionesGanado);"; | ||||||
|  |  | ||||||
|  |             return await connection.QueryAsync<CotizacionGanado>(sql); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -23,5 +23,26 @@ namespace Mercados.Infrastructure.Persistence.Repositories | |||||||
|  |  | ||||||
|             await connection.ExecuteAsync(sql, cotizaciones); |             await connection.ExecuteAsync(sql, cotizaciones); | ||||||
|         } |         } | ||||||
|  |         public async Task<IEnumerable<CotizacionGrano>> ObtenerUltimasAsync() | ||||||
|  |         { | ||||||
|  |             using IDbConnection connection = _connectionFactory.CreateConnection(); | ||||||
|  |  | ||||||
|  |             const string sql = @" | ||||||
|  |                 WITH RankedCotizaciones AS ( | ||||||
|  |                     SELECT  | ||||||
|  |                         *, | ||||||
|  |                         ROW_NUMBER() OVER(PARTITION BY Nombre ORDER BY FechaRegistro DESC) as rn | ||||||
|  |                     FROM  | ||||||
|  |                         CotizacionesGranos | ||||||
|  |                 ) | ||||||
|  |                 SELECT  | ||||||
|  |                     Id, Nombre, Precio, VariacionPrecio, FechaOperacion, FechaRegistro | ||||||
|  |                 FROM  | ||||||
|  |                     RankedCotizaciones | ||||||
|  |                 WHERE  | ||||||
|  |                     rn = 1;"; | ||||||
|  |  | ||||||
|  |             return await connection.QueryAsync<CotizacionGrano>(sql); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -5,5 +5,6 @@ namespace Mercados.Infrastructure.Persistence.Repositories | |||||||
|     public interface ICotizacionGanadoRepository : IBaseRepository |     public interface ICotizacionGanadoRepository : IBaseRepository | ||||||
|     { |     { | ||||||
|         Task GuardarMuchosAsync(IEnumerable<CotizacionGanado> cotizaciones); |         Task GuardarMuchosAsync(IEnumerable<CotizacionGanado> cotizaciones); | ||||||
|  |         Task<IEnumerable<CotizacionGanado>> ObtenerUltimaTandaAsync(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -5,5 +5,6 @@ namespace Mercados.Infrastructure.Persistence.Repositories | |||||||
|     public interface ICotizacionGranoRepository : IBaseRepository |     public interface ICotizacionGranoRepository : IBaseRepository | ||||||
|     { |     { | ||||||
|         Task GuardarMuchosAsync(IEnumerable<CotizacionGrano> cotizaciones); |         Task GuardarMuchosAsync(IEnumerable<CotizacionGrano> cotizaciones); | ||||||
|  |         Task<IEnumerable<CotizacionGrano>> ObtenerUltimasAsync(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
		Reference in New Issue
	
	Block a user