From 4530373d937f3452ce83787506cc3618a07945d4 Mon Sep 17 00:00:00 2001 From: Malcom Foxa Date: Wed, 12 Nov 2025 12:17:51 -0300 Subject: [PATCH 01/12] =?UTF-8?q?Actualiza=20configuraci=C3=B3n=20en=20app?= =?UTF-8?q?settings.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se realizaron los siguientes cambios en el archivo `appsettings.json`: - Se eliminó la referencia a la variable de entorno `${DB_PATH}` en la propiedad `DefaultConnection` de `ConnectionStrings`. - Se estableció un valor vacío (`""`) como predeterminado para `DefaultConnection`. - No se modificaron las claves JWT, pero se mantiene su estructura. Estos cambios preparan el entorno para desarrollo o pruebas, eliminando dependencias de variables de entorno específicas. --- src/SmartWallet.API/appsettings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SmartWallet.API/appsettings.json b/src/SmartWallet.API/appsettings.json index a3c9a39..b5bc30b 100644 --- a/src/SmartWallet.API/appsettings.json +++ b/src/SmartWallet.API/appsettings.json @@ -1,6 +1,6 @@ { "ConnectionStrings": { - "DefaultConnection": "${DB_PATH}" + "DefaultConnection": "" }, "Jwt": { "Key": "${JWT_SECRET}", From 20ce6ffc3fbefe6c45a6deed19b34901b8093ecc Mon Sep 17 00:00:00 2001 From: Malcom Foxa Date: Wed, 12 Nov 2025 12:41:21 -0300 Subject: [PATCH 02/12] =?UTF-8?q?Mejorar=20gesti=C3=B3n=20de=20configuraci?= =?UTF-8?q?ones=20sensibles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se actualizó `Program.cs` para priorizar el uso de variables de entorno (`JWT_SECRET` y `DB_PATH`) para las configuraciones `Jwt:Key` y `DefaultConnection`. Si no están definidas, se utiliza el valor predeterminado de `appsettings.json`. Se añadió validación para lanzar una excepción si estas configuraciones están vacías o no definidas. En `appsettings.json`, se cambió la referencia de `Jwt:Key` de `${JWT_SECRET}` a `${JWT_ST}` para reflejar un cambio en la nomenclatura de las variables de entorno. Estos cambios mejoran la seguridad y flexibilidad de la aplicación. --- src/SmartWallet.API/Program.cs | 6 ++++-- src/SmartWallet.API/appsettings.json | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/SmartWallet.API/Program.cs b/src/SmartWallet.API/Program.cs index 4949109..edf4380 100644 --- a/src/SmartWallet.API/Program.cs +++ b/src/SmartWallet.API/Program.cs @@ -3,8 +3,10 @@ var builder = WebApplication.CreateBuilder(args); // --- validar configuración --- -var jwtSecret = builder.Configuration["Jwt:Key"]; -var dbPath = builder.Configuration.GetConnectionString("DefaultConnection"); +var jwtSecret = Environment.GetEnvironmentVariable("JWT_SECRET") + ?? builder.Configuration["Jwt:Key"]; +var dbPath = Environment.GetEnvironmentVariable("DB_PATH") + ?? builder.Configuration.GetConnectionString("DefaultConnection"); if (string.IsNullOrEmpty(jwtSecret) || string.IsNullOrEmpty(dbPath)) throw new InvalidOperationException("Faltan variables en configuración: Jwt:Key o ConnectionStrings:DefaultConnection."); diff --git a/src/SmartWallet.API/appsettings.json b/src/SmartWallet.API/appsettings.json index b5bc30b..1cee133 100644 --- a/src/SmartWallet.API/appsettings.json +++ b/src/SmartWallet.API/appsettings.json @@ -3,7 +3,7 @@ "DefaultConnection": "" }, "Jwt": { - "Key": "${JWT_SECRET}", + "Key": "${JWT_ST}", "Issuer": "SmartWalletAPI", "Audience": "SmartWalletClient", "ExpireMinutes": 60 From c73724a574004a15a8fb47b87b6f1e3ad0e4f0a0 Mon Sep 17 00:00:00 2001 From: Malcom Foxa Date: Wed, 12 Nov 2025 12:53:05 -0300 Subject: [PATCH 03/12] =?UTF-8?q?Reemplazar=20cadena=20de=20conexi=C3=B3n?= =?UTF-8?q?=20por=20configuraci=C3=B3n=20JWT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se eliminó la configuración de la cadena de conexión bajo `ConnectionStrings` que apuntaba a un servidor local de SQL Server. En su lugar, se agregó una configuración para JWT que incluye una clave secreta, emisor, audiencia y tiempo de expiración. Este cambio sugiere un enfoque hacia la autenticación basada en tokens. --- src/SmartWallet.API/appsettings.Development.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/SmartWallet.API/appsettings.Development.json b/src/SmartWallet.API/appsettings.Development.json index 6fd1860..779897b 100644 --- a/src/SmartWallet.API/appsettings.Development.json +++ b/src/SmartWallet.API/appsettings.Development.json @@ -1,7 +1,5 @@ { - "ConnectionStrings": { - "DefaultConnection": "Server=localhost\\SQLEXPRESS;Database=SmartWallet;Trusted_Connection=True;MultipleActiveResultSets=true;TrustServerCertificate=True;" - }, + "Jwt": { "Key": "Qk1jY3h0b0p6c0ZkZ1ZyZ1p6d1d6d1p3c1Z6d1p3c1d6d1p3c1Z6d1p3c1d6d1p3c1Z6d1p3c1d6d1p3c1Z6d1p3c1d6d1p3c1Z6d1p3c1d6d1p3c1Z6d1p3c1d6d1p3c1Z6d1p3c1d6d1p3c1Z6d1p3", "Issuer": "SmartWalletAPI", From 620da35bf9c1d1cfc54384149ac8c6e2301b3eb1 Mon Sep 17 00:00:00 2001 From: Malcom Foxa Date: Wed, 12 Nov 2025 13:29:48 -0300 Subject: [PATCH 04/12] =?UTF-8?q?Mejoras=20en=20validaci=C3=B3n=20y=20conf?= =?UTF-8?q?iguraci=C3=B3n=20de=20la=20aplicaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se actualizó `Program.cs` para validar las variables de entorno `JWT_SECRET` y `DB_CONNECTION`, lanzando una excepción si faltan. Se reemplazó `DB_PATH` por `DB_CONNECTION`. En `appsettings.Development.json`, se agregó una cadena de conexión predeterminada para el entorno de desarrollo. En `appsettings.json`, se corrigió `Jwt:Key` para usar `${JWT_SECRET}` y se eliminaron configuraciones redundantes. Estos cambios mejoran la gestión de configuraciones y aseguran valores predeterminados adecuados para el desarrollo. --- src/SmartWallet.API/Program.cs | 7 ++++--- src/SmartWallet.API/appsettings.Development.json | 4 +++- src/SmartWallet.API/appsettings.json | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/SmartWallet.API/Program.cs b/src/SmartWallet.API/Program.cs index edf4380..8567680 100644 --- a/src/SmartWallet.API/Program.cs +++ b/src/SmartWallet.API/Program.cs @@ -5,10 +5,11 @@ // --- validar configuración --- var jwtSecret = Environment.GetEnvironmentVariable("JWT_SECRET") ?? builder.Configuration["Jwt:Key"]; -var dbPath = Environment.GetEnvironmentVariable("DB_PATH") - ?? builder.Configuration.GetConnectionString("DefaultConnection"); -if (string.IsNullOrEmpty(jwtSecret) || string.IsNullOrEmpty(dbPath)) +var connectionString = Environment.GetEnvironmentVariable("DB_CONNECTION") + ?? builder.Configuration.GetConnectionString("DefaultConnection"); + +if (string.IsNullOrEmpty(jwtSecret) || string.IsNullOrEmpty(connectionString)) throw new InvalidOperationException("Faltan variables en configuración: Jwt:Key o ConnectionStrings:DefaultConnection."); // --- servicios --- diff --git a/src/SmartWallet.API/appsettings.Development.json b/src/SmartWallet.API/appsettings.Development.json index 779897b..ba09f23 100644 --- a/src/SmartWallet.API/appsettings.Development.json +++ b/src/SmartWallet.API/appsettings.Development.json @@ -1,5 +1,7 @@ { - + "ConnectionStrings": { + "DefaultConnection": "Server=localhost;Database=SmartWallet;Trusted_Connection=True;MultipleActiveResultSets=true;TrustServerCertificate=True;" + }, "Jwt": { "Key": "Qk1jY3h0b0p6c0ZkZ1ZyZ1p6d1d6d1p3c1Z6d1p3c1d6d1p3c1Z6d1p3c1d6d1p3c1Z6d1p3c1d6d1p3c1Z6d1p3c1d6d1p3c1Z6d1p3c1d6d1p3c1Z6d1p3c1d6d1p3c1Z6d1p3c1d6d1p3c1Z6d1p3", "Issuer": "SmartWalletAPI", diff --git a/src/SmartWallet.API/appsettings.json b/src/SmartWallet.API/appsettings.json index 1cee133..77ab19f 100644 --- a/src/SmartWallet.API/appsettings.json +++ b/src/SmartWallet.API/appsettings.json @@ -3,7 +3,7 @@ "DefaultConnection": "" }, "Jwt": { - "Key": "${JWT_ST}", + "Key": "${JWT_SECRET}", "Issuer": "SmartWalletAPI", "Audience": "SmartWalletClient", "ExpireMinutes": 60 @@ -51,6 +51,6 @@ "DurationOfBreakInSeconds": 100 } } - + } From c0b033ef15d779be6c095272e4123bc7167de649 Mon Sep 17 00:00:00 2001 From: Malcom Foxa Date: Wed, 12 Nov 2025 13:45:15 -0300 Subject: [PATCH 05/12] =?UTF-8?q?Refactoriza=20configuraci=C3=B3n=20de=20c?= =?UTF-8?q?onexi=C3=B3n=20y=20validaciones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se eliminó la dependencia de variables de entorno para obtener la cadena de conexión (`connectionString`) y ahora se utiliza directamente la configuración del archivo de configuración. Se añadió lógica para establecer explícitamente las variables `Jwt:Key` y `ConnectionStrings:DefaultConnection` en `builder.Configuration`. Se implementó una validación para lanzar una excepción si las variables requeridas están ausentes, asegurando que las configuraciones necesarias estén disponibles antes de configurar los servicios. --- src/SmartWallet.API/Program.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/SmartWallet.API/Program.cs b/src/SmartWallet.API/Program.cs index 8567680..1033847 100644 --- a/src/SmartWallet.API/Program.cs +++ b/src/SmartWallet.API/Program.cs @@ -6,12 +6,15 @@ var jwtSecret = Environment.GetEnvironmentVariable("JWT_SECRET") ?? builder.Configuration["Jwt:Key"]; -var connectionString = Environment.GetEnvironmentVariable("DB_CONNECTION") - ?? builder.Configuration.GetConnectionString("DefaultConnection"); +var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); if (string.IsNullOrEmpty(jwtSecret) || string.IsNullOrEmpty(connectionString)) throw new InvalidOperationException("Faltan variables en configuración: Jwt:Key o ConnectionStrings:DefaultConnection."); +// --- setear variables en configuracion --- +builder.Configuration["Jwt:Key"] = jwtSecret; +builder.Configuration["ConnectionStrings:DefaultConnection"] = connectionString; + // --- servicios --- builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); From 2e3f41005f7e23e0e9ebd87772156a3af18f22e2 Mon Sep 17 00:00:00 2001 From: Malcom Foxa Date: Wed, 12 Nov 2025 13:59:38 -0300 Subject: [PATCH 06/12] Ajustar relaciones y restricciones en SmartWalletDbContext MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se actualizó la configuración de la relación entre entidades `Wallet` en `SmartWalletDbContext.cs` para eliminar la clave foránea anterior y agregar una nueva con la restricción `OnDelete(DeleteBehavior.Restrict)`. Esto previene eliminaciones en cascada y mejora el control de las relaciones. También se mantiene la llamada al método `modelBuilder.Seed()` para sembrar datos en el modelo. --- src/SmartWallet.Infrastructure/SmartWalletDbContext.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SmartWallet.Infrastructure/SmartWalletDbContext.cs b/src/SmartWallet.Infrastructure/SmartWalletDbContext.cs index 921cb9f..c5b7f05 100644 --- a/src/SmartWallet.Infrastructure/SmartWalletDbContext.cs +++ b/src/SmartWallet.Infrastructure/SmartWalletDbContext.cs @@ -51,7 +51,6 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) entity.HasOne(l => l.Wallet) .WithMany() .HasForeignKey(l => l.WalletId) - .HasForeignKey(l => l.WalletId) .OnDelete(DeleteBehavior.Restrict); }); From 49eb0966767a501eda817fecae0697590388f0dd Mon Sep 17 00:00:00 2001 From: Malcom Foxa Date: Wed, 12 Nov 2025 14:24:04 -0300 Subject: [PATCH 07/12] =?UTF-8?q?Refactoriza=20validaci=C3=B3n=20de=20conf?= =?UTF-8?q?iguraci=C3=B3n=20en=20Program.cs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se modificó la inicialización de las variables `jwtSecret` y `connectionString` para configurar sus valores en `builder.Configuration` antes de construir la aplicación. Se eliminó la validación inicial de estas variables y se trasladó a una validación condicional en el entorno de producción (`app.Environment.IsProduction()`), lanzando una excepción si faltan configuraciones críticas. Se añadió soporte para la infraestructura de Smart Wallet con `builder.Services.AddSmartWalletInfrastructure(builder.Configuration)`. Se reorganizó el pipeline para incluir validaciones en producción y mantener el uso de Swagger en desarrollo. --- src/SmartWallet.API/Program.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/SmartWallet.API/Program.cs b/src/SmartWallet.API/Program.cs index 1033847..dac98ae 100644 --- a/src/SmartWallet.API/Program.cs +++ b/src/SmartWallet.API/Program.cs @@ -8,9 +8,6 @@ var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); -if (string.IsNullOrEmpty(jwtSecret) || string.IsNullOrEmpty(connectionString)) - throw new InvalidOperationException("Faltan variables en configuración: Jwt:Key o ConnectionStrings:DefaultConnection."); - // --- setear variables en configuracion --- builder.Configuration["Jwt:Key"] = jwtSecret; builder.Configuration["ConnectionStrings:DefaultConnection"] = connectionString; @@ -22,6 +19,13 @@ var app = builder.Build(); +// --- validar configuración --- +if (app.Environment.IsProduction()) +{ + if (string.IsNullOrEmpty(jwtSecret) || string.IsNullOrEmpty(connectionString)) + throw new InvalidOperationException("Faltan variables en configuración: Jwt:Key o ConnectionStrings:DefaultConnection."); +} + // --- pipeline --- if (app.Environment.IsDevelopment()) { From cdccde9c7a1b5c0429ddf2b788acf5ac92d22227 Mon Sep 17 00:00:00 2001 From: Malcom Foxa Date: Wed, 12 Nov 2025 14:45:44 -0300 Subject: [PATCH 08/12] =?UTF-8?q?Validaci=C3=B3n=20de=20configuraci=C3=B3n?= =?UTF-8?q?=20en=20entornos=20no=20desarrollo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se actualizó la condición para validar el entorno de la aplicación, cambiando de `app.Environment.IsProduction()` a `!app.Environment.IsDevelopment()`. Además, se añadió una validación para garantizar que las variables críticas de configuración (`Jwt:Key` y `ConnectionStrings:DefaultConnection`) estén presentes. Si estas variables están vacías o no configuradas, se lanza una excepción para evitar errores en entornos no controlados. --- src/SmartWallet.API/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SmartWallet.API/Program.cs b/src/SmartWallet.API/Program.cs index dac98ae..fbc8b82 100644 --- a/src/SmartWallet.API/Program.cs +++ b/src/SmartWallet.API/Program.cs @@ -20,7 +20,7 @@ var app = builder.Build(); // --- validar configuración --- -if (app.Environment.IsProduction()) +if (!app.Environment.IsDevelopment()) { if (string.IsNullOrEmpty(jwtSecret) || string.IsNullOrEmpty(connectionString)) throw new InvalidOperationException("Faltan variables en configuración: Jwt:Key o ConnectionStrings:DefaultConnection."); From 43ab61dc1702abf082821481c5c3ba94a13b3e0f Mon Sep 17 00:00:00 2001 From: Malcom Foxa Date: Wed, 12 Nov 2025 14:59:02 -0300 Subject: [PATCH 09/12] =?UTF-8?q?Migrar=20configuraci=C3=B3n=20a=20Azure?= =?UTF-8?q?=20SQL=20y=20mejorar=20despliegue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se actualizó el archivo `main_smartwallet.yml` para realizar los siguientes cambios: - Reemplazo de la variable de entorno `DB_PATH` por `ConnectionString__DefaultConnection` para usar la conexión a Azure SQL en la actualización de la base de datos con Entity Framework. - Ajuste de la configuración de despliegue a Azure Web App para utilizar la conexión a Azure SQL en lugar de una base de datos local. Estos cambios facilitan la transición a una base de datos en la nube, mejorando la escalabilidad y la integración con servicios de Azure. --- .github/workflows/main_smartwallet.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main_smartwallet.yml b/.github/workflows/main_smartwallet.yml index b189f19..d505e2a 100644 --- a/.github/workflows/main_smartwallet.yml +++ b/.github/workflows/main_smartwallet.yml @@ -75,7 +75,7 @@ jobs: env: ASPNETCORE_ENVIRONMENT: Production JWT_SECRET: ${{ secrets.JWT_SECRET }} - DB_PATH: ${{ secrets.DB_PATH }} + ConnectionString__DefaultConnection: ${{ secrets.AZURE_SQL_CONNECTION }} - name: Deploy to Azure Web App id: deploy-to-webapp @@ -85,4 +85,4 @@ jobs: slot-name: 'Production' package: ./publish env: - DB_PATH: ${{ secrets.DB_PATH }} + DB_PATH: ${{ secrets.AZURE_SQL_CONNECTION }} From 6292b339f04f0b6dd86d6868229da6d70806c002 Mon Sep 17 00:00:00 2001 From: Malcom Foxa Date: Wed, 12 Nov 2025 15:11:14 -0300 Subject: [PATCH 10/12] =?UTF-8?q?Refactoriza=20variables=20de=20entorno=20?= =?UTF-8?q?para=20alineaci=C3=B3n=20con=20ASP.NET?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se actualizó la clave de entorno `JWT_SECRET` a `Jwt__Key` en la tarea "Update database with EF Core migrations" para seguir las convenciones de ASP.NET Core. Se reemplazó `DB_PATH` por `ConnectionStrings__DefaultConnection` en la tarea "Deploy to Azure Web App" para estandarizar la configuración de la conexión a la base de datos. Se añadió la variable de entorno `Jwt__Key` en la tarea "Deploy to Azure Web App" para garantizar la disponibilidad de la clave JWT durante el despliegue. Estos cambios mejoran la consistencia y claridad en la configuración de la aplicación. --- .github/workflows/main_smartwallet.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main_smartwallet.yml b/.github/workflows/main_smartwallet.yml index d505e2a..0da8743 100644 --- a/.github/workflows/main_smartwallet.yml +++ b/.github/workflows/main_smartwallet.yml @@ -74,7 +74,7 @@ jobs: run: dotnet ef database update --startup-project ../SmartWallet.API env: ASPNETCORE_ENVIRONMENT: Production - JWT_SECRET: ${{ secrets.JWT_SECRET }} + Jwt__Key: ${{ secrets.JWT_SECRET }} ConnectionString__DefaultConnection: ${{ secrets.AZURE_SQL_CONNECTION }} - name: Deploy to Azure Web App @@ -85,4 +85,5 @@ jobs: slot-name: 'Production' package: ./publish env: - DB_PATH: ${{ secrets.AZURE_SQL_CONNECTION }} + ConnectionStrings__DefaultConnection: ${{ secrets.AZURE_SQL_CONNECTION }} + Jwt__Key: ${{ secrets.JWT_SECRET }} From 6ceed551ff1b556c2bb7ac7f85cc7ce65d9f1676 Mon Sep 17 00:00:00 2001 From: Malcom Foxa Date: Wed, 12 Nov 2025 15:31:04 -0300 Subject: [PATCH 11/12] =?UTF-8?q?Correcci=C3=B3n=20y=20mejoras=20en=20conf?= =?UTF-8?q?iguraci=C3=B3n=20y=20modelo=20de=20datos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se corrigió la clave de conexión en `main_smartwallet.yml` para alinearse con la convención de .NET. En `SmartWalletDbContext.cs`: - Se añadieron propiedades obligatorias en las entidades `Transaction` y `TransactionLedger` (`CurrencyCode`, `Type`, `Status`, etc.). - Se eliminaron relaciones y claves foráneas con `Wallet` para simplificar el modelo de datos. - Se corrigieron comentarios y se mejoró la consistencia en nombres y formato. Estos cambios refuerzan las validaciones y mejoran la claridad del diseño del modelo. --- .github/workflows/main_smartwallet.yml | 2 +- .../SmartWalletDbContext.cs | 50 ++++++++++++------- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/.github/workflows/main_smartwallet.yml b/.github/workflows/main_smartwallet.yml index 0da8743..07b5461 100644 --- a/.github/workflows/main_smartwallet.yml +++ b/.github/workflows/main_smartwallet.yml @@ -75,7 +75,7 @@ jobs: env: ASPNETCORE_ENVIRONMENT: Production Jwt__Key: ${{ secrets.JWT_SECRET }} - ConnectionString__DefaultConnection: ${{ secrets.AZURE_SQL_CONNECTION }} + ConnectionStrings__DefaultConnection: ${{ secrets.AZURE_SQL_CONNECTION }} - name: Deploy to Azure Web App id: deploy-to-webapp diff --git a/src/SmartWallet.Infrastructure/SmartWalletDbContext.cs b/src/SmartWallet.Infrastructure/SmartWalletDbContext.cs index c5b7f05..80326c3 100644 --- a/src/SmartWallet.Infrastructure/SmartWalletDbContext.cs +++ b/src/SmartWallet.Infrastructure/SmartWalletDbContext.cs @@ -21,40 +21,56 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); - // --- transaction --- + // --- Transaction --- modelBuilder.Entity(entity => { entity.HasKey(t => t.Id); entity.Property(t => t.Amount) - .HasColumnType("decimal(18,2)"); + .HasColumnType("decimal(18,2)") + .IsRequired(); - entity.HasOne(t => t.Wallet) - .WithMany() - .HasForeignKey(t => t.WalletId) - .OnDelete(DeleteBehavior.Restrict); + entity.Property(t => t.CurrencyCode) + .IsRequired(); + + entity.Property(t => t.Type) + .IsRequired(); + + entity.Property(t => t.Status) + .IsRequired(); + + entity.Property(t => t.CreatedAt) + .IsRequired(); - entity.HasOne(t => t.DestinationWallet) - .WithMany(w => w.ReceivedTransfers) - .HasForeignKey(t => t.DestinationWalletId) - .OnDelete(DeleteBehavior.Restrict); }); - // --- transactionLedger --- + // --- TransactionLedger --- modelBuilder.Entity(entity => { entity.HasKey(l => l.Id); entity.Property(l => l.Amount) - .HasColumnType("decimal(18,2)"); + .HasColumnType("decimal(18,2)") + .IsRequired(); + + entity.Property(l => l.CurrencyCode) + .IsRequired(); + + entity.Property(l => l.Type) + .IsRequired(); + + entity.Property(l => l.Status) + .IsRequired(); + + entity.Property(l => l.Timestamp) + .IsRequired(); - entity.HasOne(l => l.Wallet) - .WithMany() - .HasForeignKey(l => l.WalletId) - .OnDelete(DeleteBehavior.Restrict); }); - modelBuilder.Seed(); // Llamada al método de extensión para sembrar datos + // --- seed inicial --- + modelBuilder.Seed(); } + + } } From 5b162eecaa73dae1e75621b1497aac12aa1a2c17 Mon Sep 17 00:00:00 2001 From: Malcom Foxa Date: Wed, 12 Nov 2025 15:43:07 -0300 Subject: [PATCH 12/12] Refactoriza relaciones y propiedades en Wallet y DbContext MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se realizaron los siguientes cambios: - En `Wallet.cs`: - Se eliminaron las propiedades `SourceLedgers` y `DestinationLedgers`. - Se agregó la propiedad `TransactionLedgers` para asientos contables. - Se consolidaron las transacciones en `Transactions` (origen). - Se mantuvo `ReceivedTransfers` para transacciones recibidas (destino). - En `SmartWalletDbContext.cs`: - Se reorganizó el formato de propiedades en `Transaction` y `TransactionLedger`. - Se definieron relaciones explícitas entre `Wallet`, `Transaction` y `TransactionLedger` con claves foráneas y eliminación restringida. - Se añadió el método `modelBuilder.Seed()` para inicialización de datos. Estos cambios mejoran la claridad, integridad referencial y estructura del modelo. --- src/SmartWallet.Domain/Entities/Wallet.cs | 6 +-- .../SmartWalletDbContext.cs | 51 ++++++++++--------- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/SmartWallet.Domain/Entities/Wallet.cs b/src/SmartWallet.Domain/Entities/Wallet.cs index 42a5dd2..02e5875 100644 --- a/src/SmartWallet.Domain/Entities/Wallet.cs +++ b/src/SmartWallet.Domain/Entities/Wallet.cs @@ -32,9 +32,9 @@ public class Wallet // Navegaciones inversas - public ICollection SourceLedgers { get; private set; } = new List(); - public ICollection DestinationLedgers { get; private set; } = new List(); - public ICollection ReceivedTransfers { get; private set; } = new List(); + public ICollection Transactions { get; private set; } = new List(); // origen + public ICollection ReceivedTransfers { get; private set; } = new List(); // destino + public ICollection TransactionLedgers { get; private set; } = new List(); // asientos // --- constructores --- diff --git a/src/SmartWallet.Infrastructure/SmartWalletDbContext.cs b/src/SmartWallet.Infrastructure/SmartWalletDbContext.cs index 80326c3..abcbbc9 100644 --- a/src/SmartWallet.Infrastructure/SmartWalletDbContext.cs +++ b/src/SmartWallet.Infrastructure/SmartWalletDbContext.cs @@ -30,18 +30,22 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .HasColumnType("decimal(18,2)") .IsRequired(); - entity.Property(t => t.CurrencyCode) - .IsRequired(); - - entity.Property(t => t.Type) - .IsRequired(); - - entity.Property(t => t.Status) - .IsRequired(); - - entity.Property(t => t.CreatedAt) - .IsRequired(); - + entity.Property(t => t.CurrencyCode).IsRequired(); + entity.Property(t => t.Type).IsRequired(); + entity.Property(t => t.Status).IsRequired(); + entity.Property(t => t.CreatedAt).IsRequired(); + + // relación con Wallet origen + entity.HasOne(t => t.Wallet) + .WithMany(w => w.Transactions) + .HasForeignKey(t => t.WalletId) + .OnDelete(DeleteBehavior.Restrict); + + // relación con Wallet destino + entity.HasOne(t => t.DestinationWallet) + .WithMany(w => w.ReceivedTransfers) + .HasForeignKey(t => t.DestinationWalletId) + .OnDelete(DeleteBehavior.Restrict); }); // --- TransactionLedger --- @@ -53,24 +57,23 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .HasColumnType("decimal(18,2)") .IsRequired(); - entity.Property(l => l.CurrencyCode) - .IsRequired(); - - entity.Property(l => l.Type) - .IsRequired(); - - entity.Property(l => l.Status) - .IsRequired(); - - entity.Property(l => l.Timestamp) - .IsRequired(); + entity.Property(l => l.CurrencyCode).IsRequired(); + entity.Property(l => l.Type).IsRequired(); + entity.Property(l => l.Status).IsRequired(); + entity.Property(l => l.Timestamp).IsRequired(); + // relación con Wallet + entity.HasOne(l => l.Wallet) + .WithMany(w => w.TransactionLedgers) + .HasForeignKey(l => l.WalletId) + .OnDelete(DeleteBehavior.Restrict); }); // --- seed inicial --- modelBuilder.Seed(); } - + + } }