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