using Dapper; using SIGCM2.Application.Abstractions.Persistence; using SIGCM2.Domain.Entities; namespace SIGCM2.Infrastructure.Persistence; public sealed class PermisoRepository : IPermisoRepository { private readonly SqlConnectionFactory _connectionFactory; public PermisoRepository(SqlConnectionFactory connectionFactory) { _connectionFactory = connectionFactory; } public async Task> ListAsync(CancellationToken ct = default) { const string sql = """ SELECT Id, Codigo, Nombre, Descripcion, Modulo, Activo, FechaCreacion FROM dbo.Permiso ORDER BY Id """; await using var connection = _connectionFactory.CreateConnection(); await connection.OpenAsync(ct); var rows = await connection.QueryAsync(sql); return rows.Select(MapRow).ToList(); } public async Task GetByCodigoAsync(string codigo, CancellationToken ct = default) { const string sql = """ SELECT Id, Codigo, Nombre, Descripcion, Modulo, Activo, FechaCreacion FROM dbo.Permiso WHERE Codigo = @Codigo """; await using var connection = _connectionFactory.CreateConnection(); await connection.OpenAsync(ct); var row = await connection.QuerySingleOrDefaultAsync(sql, new { Codigo = codigo }); return row is null ? null : MapRow(row); } public async Task> GetByCodigosAsync( IEnumerable codigos, CancellationToken ct = default) { var codigosList = codigos.ToList(); if (codigosList.Count == 0) return Array.Empty(); const string sql = """ SELECT Id, Codigo, Nombre, Descripcion, Modulo, Activo, FechaCreacion FROM dbo.Permiso WHERE Codigo IN @Codigos """; await using var connection = _connectionFactory.CreateConnection(); await connection.OpenAsync(ct); var rows = await connection.QueryAsync(sql, new { Codigos = codigosList }); return rows.Select(MapRow).ToList(); } private static Permiso MapRow(PermisoRow row) => Permiso.ForRead( id: row.Id, codigo: row.Codigo, nombre: row.Nombre, descripcion: row.Descripcion, modulo: row.Modulo, activo: row.Activo, fechaCreacion: row.FechaCreacion); private sealed record PermisoRow( int Id, string Codigo, string Nombre, string? Descripcion, string Modulo, bool Activo, DateTime FechaCreacion); }