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" } }