// backend/src/Titulares.Api/Data/TitularRepositorio.cs using Dapper; using Microsoft.Data.SqlClient; using Titulares.Api.Models; namespace Titulares.Api.Data; public class TitularRepositorio { private readonly string _connectionString; public TitularRepositorio(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("DefaultConnection")!; } private SqlConnection CreateConnection() => new SqlConnection(_connectionString); public async Task> ObtenerTodosAsync() { using var connection = CreateConnection(); // Siempre los obtenemos en el orden correcto return await connection.QueryAsync("SELECT * FROM Titulares ORDER BY OrdenVisual"); } public async Task CrearManualAsync(CrearTitularDto titularDto) { using var connection = CreateConnection(); // Obtenemos el OrdenVisual más bajo (el primero) y restamos 1 para ponerlo al inicio. var minOrdenVisual = await connection.ExecuteScalarAsync("SELECT MIN(OrdenVisual) FROM Titulares") ?? 1; var nuevoOrden = minOrdenVisual - 1; var sql = @" INSERT INTO Titulares (Texto, ModificadoPorUsuario, EsEntradaManual, OrdenVisual, Tipo, Fuente) VALUES (@Texto, 0, 1, @OrdenVisual, 'Manual', 'Usuario'); SELECT CAST(SCOPE_IDENTITY() as int); "; return await connection.ExecuteScalarAsync(sql, new { titularDto.Texto, OrdenVisual = nuevoOrden }); } public async Task ActualizarTextoAsync(int id, ActualizarTitularDto titularDto) { using var connection = CreateConnection(); var sql = @" UPDATE Titulares SET Texto = @Texto, ModificadoPorUsuario = 1, Tipo = 'Edited' WHERE Id = @Id; "; var affectedRows = await connection.ExecuteAsync(sql, new { titularDto.Texto, Id = id }); return affectedRows > 0; } public async Task EliminarAsync(int id) { using var connection = CreateConnection(); var affectedRows = await connection.ExecuteAsync("DELETE FROM Titulares WHERE Id = @Id", new { Id = id }); return affectedRows > 0; } public async Task ActualizarOrdenAsync(List ordenes) { using var connection = CreateConnection(); await connection.OpenAsync(); using var transaction = connection.BeginTransaction(); try { foreach (var item in ordenes) { await connection.ExecuteAsync( "UPDATE Titulares SET OrdenVisual = @NuevoOrden WHERE Id = @Id", item, transaction: transaction); } transaction.Commit(); return true; } catch { transaction.Rollback(); return false; } } }