Fase 1: Creación del backend API con .NET, Dapper y endpoints CRUD para Titulares
This commit is contained in:
85
backend/src/Titulares.Api/Data/TitularRepositorio.cs
Normal file
85
backend/src/Titulares.Api/Data/TitularRepositorio.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user