149 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			149 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 
								 | 
							
								using Dapper;
							 | 
						||
| 
								 | 
							
								using GestionIntegral.Api.Models.Radios;
							 | 
						||
| 
								 | 
							
								using Microsoft.Extensions.Logging;
							 | 
						||
| 
								 | 
							
								using System;
							 | 
						||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						||
| 
								 | 
							
								using System.Data;
							 | 
						||
| 
								 | 
							
								using System.Linq;
							 | 
						||
| 
								 | 
							
								using System.Text;
							 | 
						||
| 
								 | 
							
								using System.Threading.Tasks;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace GestionIntegral.Api.Data.Repositories.Radios
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public class RitmoRepository : IRitmoRepository
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        private readonly DbConnectionFactory _cf;
							 | 
						||
| 
								 | 
							
								        private readonly ILogger<RitmoRepository> _log;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public RitmoRepository(DbConnectionFactory cf, ILogger<RitmoRepository> log)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            _cf = cf;
							 | 
						||
| 
								 | 
							
								            _log = log;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<IEnumerable<Ritmo>> GetAllAsync(string? nombreFilter)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var sqlBuilder = new StringBuilder("SELECT Id, Ritmo AS NombreRitmo FROM dbo.rad_dtRitmos WHERE 1=1");
							 | 
						||
| 
								 | 
							
								            var parameters = new DynamicParameters();
							 | 
						||
| 
								 | 
							
								            if (!string.IsNullOrWhiteSpace(nombreFilter))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                sqlBuilder.Append(" AND Ritmo LIKE @NombreFilterParam");
							 | 
						||
| 
								 | 
							
								                parameters.Add("NombreFilterParam", $"%{nombreFilter}%");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            sqlBuilder.Append(" ORDER BY Ritmo;");
							 | 
						||
| 
								 | 
							
								            try
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                using var connection = _cf.CreateConnection();
							 | 
						||
| 
								 | 
							
								                return await connection.QueryAsync<Ritmo>(sqlBuilder.ToString(), parameters);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                _log.LogError(ex, "Error al obtener todos los Ritmos.");
							 | 
						||
| 
								 | 
							
								                return Enumerable.Empty<Ritmo>();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<Ritmo?> GetByIdAsync(int id)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            const string sql = "SELECT Id, Ritmo AS NombreRitmo FROM dbo.rad_dtRitmos WHERE Id = @IdParam";
							 | 
						||
| 
								 | 
							
								            try
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                using var connection = _cf.CreateConnection();
							 | 
						||
| 
								 | 
							
								                return await connection.QuerySingleOrDefaultAsync<Ritmo>(sql, new { IdParam = id });
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                _log.LogError(ex, "Error al obtener Ritmo por ID: {IdRitmo}", id);
							 | 
						||
| 
								 | 
							
								                return null;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<bool> ExistsByNameAsync(string nombreRitmo, int? excludeId = null)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var sqlBuilder = new StringBuilder("SELECT COUNT(1) FROM dbo.rad_dtRitmos WHERE Ritmo = @NombreRitmoParam");
							 | 
						||
| 
								 | 
							
								            var parameters = new DynamicParameters();
							 | 
						||
| 
								 | 
							
								            parameters.Add("NombreRitmoParam", nombreRitmo);
							 | 
						||
| 
								 | 
							
								            if (excludeId.HasValue)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                sqlBuilder.Append(" AND Id != @ExcludeIdParam");
							 | 
						||
| 
								 | 
							
								                parameters.Add("ExcludeIdParam", excludeId.Value);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            try
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                using var connection = _cf.CreateConnection();
							 | 
						||
| 
								 | 
							
								                return await connection.ExecuteScalarAsync<bool>(sqlBuilder.ToString(), parameters);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                _log.LogError(ex, "Error en ExistsByNameAsync para Ritmo: {NombreRitmo}", nombreRitmo);
							 | 
						||
| 
								 | 
							
								                return true;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<bool> IsInUseAsync(int id)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            const string sql = "SELECT TOP 1 1 FROM dbo.rad_dtCanciones WHERE Ritmo = @IdParam"; // Columna 'Ritmo' en Canciones es FK a 'Id' en Ritmos
							 | 
						||
| 
								 | 
							
								            try
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                using var connection = _cf.CreateConnection();
							 | 
						||
| 
								 | 
							
								                return await connection.ExecuteScalarAsync<bool>(sql, new { IdParam = id });
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                 _log.LogError(ex, "Error en IsInUseAsync para Ritmo ID: {IdRitmo}", id);
							 | 
						||
| 
								 | 
							
								                return true;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<Ritmo?> CreateAsync(Ritmo nuevoRitmo /*, int idUsuario, IDbTransaction transaction */)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            // Sin historial, no se necesita transacción aquí para una sola inserción.
							 | 
						||
| 
								 | 
							
								            const string sqlInsert = @"
							 | 
						||
| 
								 | 
							
								                INSERT INTO dbo.rad_dtRitmos (Ritmo)
							 | 
						||
| 
								 | 
							
								                OUTPUT INSERTED.Id, INSERTED.Ritmo AS NombreRitmo
							 | 
						||
| 
								 | 
							
								                VALUES (@NombreRitmo);";
							 | 
						||
| 
								 | 
							
								            try
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                using var connection = _cf.CreateConnection();
							 | 
						||
| 
								 | 
							
								                return await connection.QuerySingleAsync<Ritmo>(sqlInsert, nuevoRitmo);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch(Exception ex)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                _log.LogError(ex, "Error al crear Ritmo: {NombreRitmo}", nuevoRitmo.NombreRitmo);
							 | 
						||
| 
								 | 
							
								                return null;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<bool> UpdateAsync(Ritmo ritmoAActualizar /*, int idUsuario, IDbTransaction transaction */)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            const string sqlUpdate = "UPDATE dbo.rad_dtRitmos SET Ritmo = @NombreRitmo WHERE Id = @Id;";
							 | 
						||
| 
								 | 
							
								            try
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                using var connection = _cf.CreateConnection();
							 | 
						||
| 
								 | 
							
								                var rowsAffected = await connection.ExecuteAsync(sqlUpdate, ritmoAActualizar);
							 | 
						||
| 
								 | 
							
								                return rowsAffected == 1;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch(Exception ex)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                _log.LogError(ex, "Error al actualizar Ritmo ID: {IdRitmo}", ritmoAActualizar.Id);
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<bool> DeleteAsync(int id /*, int idUsuario, IDbTransaction transaction */)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            const string sqlDelete = "DELETE FROM dbo.rad_dtRitmos WHERE Id = @IdParam";
							 | 
						||
| 
								 | 
							
								            try
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                using var connection = _cf.CreateConnection();
							 | 
						||
| 
								 | 
							
								                var rowsAffected = await connection.ExecuteAsync(sqlDelete, new { IdParam = id });
							 | 
						||
| 
								 | 
							
								                return rowsAffected == 1;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch(Exception ex)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                _log.LogError(ex, "Error al eliminar Ritmo ID: {IdRitmo}", id);
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |