From e063f023fb0f0c126d80593cd8b02cea6c197c43 Mon Sep 17 00:00:00 2001 From: Steven Dracker Date: Sun, 29 Mar 2026 15:11:33 -0400 Subject: [PATCH] feat(CC-ERATE-000056): add Postgres as configurable database provider MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduces DatabaseProvider config key ("Sqlite" | "Postgres") alongside Npgsql.EntityFrameworkCore.PostgreSQL 8.0.11. Startup branches on provider: SQLite continues to use Migrate(); Postgres uses EnsureCreated() to bypass SQLite-specific PRAGMA migrations. Provider name is logged at startup. Default remains SQLite — no behaviour change unless DatabaseProvider=Postgres. Co-Authored-By: Claude Sonnet 4.6 --- .../ErateWorkbench.Api.csproj | 1 + src/ErateWorkbench.Api/Program.cs | 28 +++++++++++++++---- src/ErateWorkbench.Api/appsettings.json | 4 ++- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/ErateWorkbench.Api/ErateWorkbench.Api.csproj b/src/ErateWorkbench.Api/ErateWorkbench.Api.csproj index 2a7e6fc..02ca720 100644 --- a/src/ErateWorkbench.Api/ErateWorkbench.Api.csproj +++ b/src/ErateWorkbench.Api/ErateWorkbench.Api.csproj @@ -20,6 +20,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + diff --git a/src/ErateWorkbench.Api/Program.cs b/src/ErateWorkbench.Api/Program.cs index a2ec96b..15e7c49 100644 --- a/src/ErateWorkbench.Api/Program.cs +++ b/src/ErateWorkbench.Api/Program.cs @@ -29,11 +29,23 @@ includeControllerXmlComments: true); }); -var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") - ?? "Data Source=erate-workbench.db"; +var dbProvider = builder.Configuration["DatabaseProvider"] ?? "Sqlite"; builder.Services.AddDbContext(options => - options.UseSqlite(connectionString)); +{ + if (dbProvider.Equals("Postgres", StringComparison.OrdinalIgnoreCase)) + { + var pgConn = builder.Configuration.GetConnectionString("Postgres") + ?? throw new InvalidOperationException("ConnectionStrings:Postgres is required when DatabaseProvider=Postgres"); + options.UseNpgsql(pgConn); + } + else + { + var sqliteConn = builder.Configuration.GetConnectionString("DefaultConnection") + ?? "Data Source=erate-workbench.db"; + options.UseSqlite(sqliteConn); + } +}); builder.Services.AddHttpClient(); builder.Services.AddScoped(); @@ -91,11 +103,17 @@ app.UseHttpsRedirection(); -// Apply migrations on startup +// Apply migrations on startup (SQLite) or create schema (Postgres) using (var scope = app.Services.CreateScope()) { var dbContext = scope.ServiceProvider.GetRequiredService(); - dbContext.Database.Migrate(); + var startupLogger = scope.ServiceProvider.GetRequiredService>(); + startupLogger.LogInformation("Database provider: {Provider}", dbProvider); + + if (dbProvider.Equals("Postgres", StringComparison.OrdinalIgnoreCase)) + dbContext.Database.EnsureCreated(); + else + dbContext.Database.Migrate(); } // --- Health --- diff --git a/src/ErateWorkbench.Api/appsettings.json b/src/ErateWorkbench.Api/appsettings.json index 1cfdf8e..443a767 100644 --- a/src/ErateWorkbench.Api/appsettings.json +++ b/src/ErateWorkbench.Api/appsettings.json @@ -9,7 +9,9 @@ } }, "AllowedHosts": "*", + "DatabaseProvider": "Sqlite", "ConnectionStrings": { - "DefaultConnection": "Data Source=erate-workbench.db" + "DefaultConnection": "Data Source=erate-workbench.db", + "Postgres": "Host=localhost;Port=5432;Database=eratedb;Username=erate;Password=erate" } }