diff --git a/colaflow-api/src/ColaFlow.API/Program.cs b/colaflow-api/src/ColaFlow.API/Program.cs index a742d60..b4d4ffe 100644 --- a/colaflow-api/src/ColaFlow.API/Program.cs +++ b/colaflow-api/src/ColaFlow.API/Program.cs @@ -5,7 +5,10 @@ using ColaFlow.API.Middleware; using ColaFlow.API.Services; using ColaFlow.Modules.Identity.Application; using ColaFlow.Modules.Identity.Infrastructure; +using ColaFlow.Modules.Identity.Infrastructure.Persistence; +using ColaFlow.Modules.ProjectManagement.Infrastructure.Persistence; using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using Scalar.AspNetCore; using System.Text; @@ -198,6 +201,52 @@ app.MapHealthChecks("/health"); app.MapHub("/hubs/project"); app.MapHub("/hubs/notification"); +// ============================================ +// Auto-migrate databases in development +// ============================================ +if (app.Environment.IsDevelopment()) +{ + app.Logger.LogInformation("Running in Development mode, applying database migrations..."); + + using (var scope = app.Services.CreateScope()) + { + var services = scope.ServiceProvider; + + try + { + // Migrate Identity module + var identityDbContext = services.GetRequiredService(); + await identityDbContext.Database.MigrateAsync(); + app.Logger.LogInformation("✅ Identity module migrations applied successfully"); + + // Migrate ProjectManagement module + var pmDbContext = services.GetRequiredService(); + await pmDbContext.Database.MigrateAsync(); + app.Logger.LogInformation("✅ ProjectManagement module migrations applied successfully"); + + // Migrate IssueManagement module (if exists) + try + { + var issueDbContext = services.GetRequiredService(); + await issueDbContext.Database.MigrateAsync(); + app.Logger.LogInformation("✅ IssueManagement module migrations applied successfully"); + } + catch (InvalidOperationException) + { + // IssueManagement module may not exist yet or not registered + app.Logger.LogWarning("⚠️ IssueManagement module not found, skipping migrations"); + } + + app.Logger.LogInformation("🎉 All database migrations completed successfully!"); + } + catch (Exception ex) + { + app.Logger.LogError(ex, "❌ Error occurred while applying migrations"); + throw; // Re-throw to prevent app from starting with broken database + } + } +} + app.Run(); // Make the implicit Program class public for integration tests diff --git a/scripts/seed-data.sql b/scripts/seed-data.sql index b1b42a8..8c5f5b9 100644 --- a/scripts/seed-data.sql +++ b/scripts/seed-data.sql @@ -70,8 +70,8 @@ BEGIN v_owner_user_id, v_tenant_id, 'owner@demo.com', - -- BCrypt hash for 'Demo@123456' - '$2a$11$ZqX5Z5Z5Z5Z5Z5Z5Z5Z5ZuZqX5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5', + -- BCrypt hash for 'Demo@123456' (workFactor=11) + '$2a$11$VkcKFpWpEurtrkrEJzd1lOaDEa/KAXiOZzOUE94mfMFlqBNkANxSK', 'John Owner', 'Active', 'local', @@ -94,8 +94,8 @@ BEGIN v_developer_user_id, v_tenant_id, 'developer@demo.com', - -- BCrypt hash for 'Demo@123456' - '$2a$11$ZqX5Z5Z5Z5Z5Z5Z5Z5Z5ZuZqX5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5', + -- BCrypt hash for 'Demo@123456' (workFactor=11) + '$2a$11$VkcKFpWpEurtrkrEJzd1lOaDEa/KAXiOZzOUE94mfMFlqBNkANxSK', 'Jane Developer', 'Active', 'local',