Fase 1: Creación del backend API con .NET, Dapper y endpoints CRUD para Titulares

This commit is contained in:
2025-10-28 11:33:28 -03:00
parent c5f1e76fc2
commit 2c44081e5d
11 changed files with 355 additions and 11 deletions

View File

@@ -0,0 +1,85 @@
// 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<IEnumerable<Titular>> ObtenerTodosAsync()
{
using var connection = CreateConnection();
// Siempre los obtenemos en el orden correcto
return await connection.QueryAsync<Titular>("SELECT * FROM Titulares ORDER BY OrdenVisual");
}
public async Task<int> 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<int?>("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<int>(sql, new { titularDto.Texto, OrdenVisual = nuevoOrden });
}
public async Task<bool> 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<bool> 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<bool> ActualizarOrdenAsync(List<ReordenarTitularDto> 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;
}
}
}