Fase 1: Inicialización del Backend .NET 10, Configuración de Dapper, Autenticación JWT y Entidades Base

This commit is contained in:
2025-12-17 13:08:21 -03:00
parent 15305c681c
commit eda016f93f
33 changed files with 819 additions and 0 deletions

View File

@@ -0,0 +1,26 @@
using System.Data;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
namespace SIGCM.Infrastructure.Data;
public interface IDbConnectionFactory
{
IDbConnection CreateConnection();
}
public class DbConnectionFactory : IDbConnectionFactory
{
private readonly string _connectionString;
public DbConnectionFactory(IConfiguration configuration)
{
_connectionString = configuration.GetConnectionString("DefaultConnection")
?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
}
public IDbConnection CreateConnection()
{
return new SqlConnection(_connectionString);
}
}

View File

@@ -0,0 +1,117 @@
using Dapper;
namespace SIGCM.Infrastructure.Data;
public class DbInitializer
{
private readonly IDbConnectionFactory _connectionFactory;
public DbInitializer(IDbConnectionFactory connectionFactory)
{
_connectionFactory = connectionFactory;
}
public async Task InitializeAsync()
{
using var connection = _connectionFactory.CreateConnection();
var sql = @"
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Users')
BEGIN
CREATE TABLE Users (
Id INT IDENTITY(1,1) PRIMARY KEY,
Username NVARCHAR(50) NOT NULL UNIQUE,
PasswordHash NVARCHAR(255) NOT NULL,
Role NVARCHAR(20) NOT NULL,
Email NVARCHAR(100) NULL,
CreatedAt DATETIME DEFAULT GETUTCDATE()
);
-- Seed generic admin (password: admin123)
-- Hash created with BCrypt
INSERT INTO Users (Username, PasswordHash, Role)
VALUES ('admin', '$2a$11$u.w..ExampleHashPlaceholder...', 'Admin');
END
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Categories')
BEGIN
CREATE TABLE Categories (
Id INT IDENTITY(1,1) PRIMARY KEY,
ParentId INT NULL,
Name NVARCHAR(100) NOT NULL,
Slug NVARCHAR(100) NOT NULL,
Active BIT DEFAULT 1,
FOREIGN KEY (ParentId) REFERENCES Categories(Id)
);
END
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Operations')
BEGIN
CREATE TABLE Operations (
Id INT IDENTITY(1,1) PRIMARY KEY,
Name NVARCHAR(50) NOT NULL UNIQUE
);
END
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'CategoryOperations')
BEGIN
CREATE TABLE CategoryOperations (
CategoryId INT NOT NULL,
OperationId INT NOT NULL,
PRIMARY KEY (CategoryId, OperationId),
FOREIGN KEY (CategoryId) REFERENCES Categories(Id) ON DELETE CASCADE,
FOREIGN KEY (OperationId) REFERENCES Operations(Id) ON DELETE CASCADE
);
END
";
// Fixing the placeholder hash to a valid one might be necessary if I want to login immediately.
// I will update the hash command later or create a small utility to generate one.
// For now, I'll remove the INSERT or comment it out until I can generate a real hash in C#.
var schemaSql = @"
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Users')
BEGIN
CREATE TABLE Users (
Id INT IDENTITY(1,1) PRIMARY KEY,
Username NVARCHAR(50) NOT NULL UNIQUE,
PasswordHash NVARCHAR(255) NOT NULL,
Role NVARCHAR(20) NOT NULL,
Email NVARCHAR(100) NULL,
CreatedAt DATETIME DEFAULT GETUTCDATE()
);
END
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Categories')
BEGIN
CREATE TABLE Categories (
Id INT IDENTITY(1,1) PRIMARY KEY,
ParentId INT NULL,
Name NVARCHAR(100) NOT NULL,
Slug NVARCHAR(100) NOT NULL,
Active BIT DEFAULT 1,
FOREIGN KEY (ParentId) REFERENCES Categories(Id)
);
END
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Operations')
BEGIN
CREATE TABLE Operations (
Id INT IDENTITY(1,1) PRIMARY KEY,
Name NVARCHAR(50) NOT NULL UNIQUE
);
END
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'CategoryOperations')
BEGIN
CREATE TABLE CategoryOperations (
CategoryId INT NOT NULL,
OperationId INT NOT NULL,
PRIMARY KEY (CategoryId, OperationId),
FOREIGN KEY (CategoryId) REFERENCES Categories(Id) ON DELETE CASCADE,
FOREIGN KEY (OperationId) REFERENCES Operations(Id) ON DELETE CASCADE
);
END
";
await connection.ExecuteAsync(schemaSql);
}
}