From 9f653103533fa23b0a9384a13041030e143a3779 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sun, 1 Dec 2024 11:04:16 +0100 Subject: [PATCH] Add PostgreSQL support for database providers Introduced PostgreSQL as a new database provider option in the application. Created an enumeration for SQL database providers and updated configurations and project references to support PostgreSQL. Adjusted logic to accommodate the new provider, ensuring integration across components. --- .../Elsa.ServerAndStudio.Web.csproj | 4 +++ .../Enums/SqlDatabaseProvider.cs | 10 +++++++ src/apps/Elsa.ServerAndStudio.Web/Program.cs | 26 +++++++++++-------- .../Elsa.ServerAndStudio.Web/appsettings.json | 7 +++-- .../PostgreSqlProvidersExtensions.cs | 2 +- 5 files changed, 33 insertions(+), 16 deletions(-) create mode 100644 src/apps/Elsa.ServerAndStudio.Web/Enums/SqlDatabaseProvider.cs diff --git a/src/apps/Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web.csproj b/src/apps/Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web.csproj index 7a9f688cd..1c73d2f23 100644 --- a/src/apps/Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web.csproj +++ b/src/apps/Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web.csproj @@ -10,11 +10,15 @@ + + + + diff --git a/src/apps/Elsa.ServerAndStudio.Web/Enums/SqlDatabaseProvider.cs b/src/apps/Elsa.ServerAndStudio.Web/Enums/SqlDatabaseProvider.cs new file mode 100644 index 000000000..ee524806a --- /dev/null +++ b/src/apps/Elsa.ServerAndStudio.Web/Enums/SqlDatabaseProvider.cs @@ -0,0 +1,10 @@ +namespace Elsa.ServerAndStudio.Web.Enums; + +public enum SqlDatabaseProvider +{ + SqlServer, + Sqlite, + MySql, + PostgreSql, + CockroachDb +} \ No newline at end of file diff --git a/src/apps/Elsa.ServerAndStudio.Web/Program.cs b/src/apps/Elsa.ServerAndStudio.Web/Program.cs index 59db60e34..f807851c7 100644 --- a/src/apps/Elsa.ServerAndStudio.Web/Program.cs +++ b/src/apps/Elsa.ServerAndStudio.Web/Program.cs @@ -24,11 +24,10 @@ var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseStaticWebAssets(); var services = builder.Services; var configuration = builder.Configuration; -var featuresSection = configuration.GetSection("Features"); -var databaseProvider = featuresSection.GetValue("DatabaseProvider"); var sqliteConnectionString = configuration.GetConnectionString("Sqlite")!; var mySqlConnectionString = configuration.GetConnectionString("MySql")!; var sqlServerConnectionString = configuration.GetConnectionString("SqlServer")!; +var postgreSqlConnectionString = configuration.GetConnectionString("PostgreSql")!; var rabbitMqConnectionString = configuration.GetConnectionString("RabbitMq")!; var azureServiceBusConnectionString = configuration.GetConnectionString("AzureServiceBus")!; var identitySection = configuration.GetSection("Identity"); @@ -36,6 +35,7 @@ var identityTokenSection = identitySection.GetSection("Tokens"); var massTransitSection = configuration.GetSection("MassTransit"); var massTransitDispatcherSection = configuration.GetSection("MassTransit.Dispatcher"); var heartbeatSection = configuration.GetSection("Heartbeat"); +var sqlDatabaseProvider = Enum.Parse(configuration["DatabaseProvider"] ?? "Sqlite"); services.Configure(massTransitSection); services.Configure(massTransitDispatcherSection); @@ -65,20 +65,22 @@ services if (useCaching) management.UseCache(); - if (databaseProvider == "MySql") + if (sqlDatabaseProvider == SqlDatabaseProvider.MySql) management.UseEntityFrameworkCore(ef => ef.UseMySql(mySqlConnectionString)); - else if (databaseProvider == "SqlServer") + else if (sqlDatabaseProvider == SqlDatabaseProvider.SqlServer) management.UseEntityFrameworkCore(ef => ef.UseSqlServer(sqlServerConnectionString)); - else if (databaseProvider == "Sqlite") + else if (sqlDatabaseProvider == SqlDatabaseProvider.Sqlite) management.UseEntityFrameworkCore(ef => ef.UseSqlite(sqliteConnectionString)); }) .UseWorkflowRuntime(runtime => { - if (databaseProvider == "MySql") + if (sqlDatabaseProvider == SqlDatabaseProvider.MySql) runtime.UseEntityFrameworkCore(ef => ef.UseMySql(mySqlConnectionString)); - else if (databaseProvider == "SqlServer") + else if (sqlDatabaseProvider == SqlDatabaseProvider.SqlServer) runtime.UseEntityFrameworkCore(ef => ef.UseSqlServer(sqlServerConnectionString)); - else if (databaseProvider == "Sqlite") + else if(sqlDatabaseProvider == SqlDatabaseProvider.PostgreSql) + runtime.UseEntityFrameworkCore(ef => ef.UsePostgreSql(postgreSqlConnectionString)); + else if (sqlDatabaseProvider == SqlDatabaseProvider.Sqlite) runtime.UseEntityFrameworkCore(ef => ef.UseSqlite(sqliteConnectionString)); if (useMassTransit) @@ -122,11 +124,13 @@ services .UseAgentsApi() .UseAgentPersistence(persistence => persistence.UseEntityFrameworkCore(ef => { - if (databaseProvider == "MySql") + if (sqlDatabaseProvider == SqlDatabaseProvider.MySql) ef.UseMySql(mySqlConnectionString); - else if (databaseProvider == "SqlServer") + else if (sqlDatabaseProvider == SqlDatabaseProvider.SqlServer) ef.UseSqlServer(sqlServerConnectionString); - else if (databaseProvider == "Sqlite") + else if(sqlDatabaseProvider == SqlDatabaseProvider.PostgreSql) + ef.UsePostgreSql(postgreSqlConnectionString); + else if (sqlDatabaseProvider == SqlDatabaseProvider.Sqlite) ef.UseSqlite(sqliteConnectionString); })) .UseAgentActivities() diff --git a/src/apps/Elsa.ServerAndStudio.Web/appsettings.json b/src/apps/Elsa.ServerAndStudio.Web/appsettings.json index 843df197e..0e85580b3 100644 --- a/src/apps/Elsa.ServerAndStudio.Web/appsettings.json +++ b/src/apps/Elsa.ServerAndStudio.Web/appsettings.json @@ -12,11 +12,10 @@ "Sqlite": "Data Source=elsa.sqlite.db;Cache=Shared;", "RabbitMq": "rabbitmq://guest:guest@localhost:5672", "MySql": "Server=localhost;Database=elsa;Uid=user;Pwd=password;", - "SqlServer": "Server=localhost;Database=elsa;User Id=sa;Password=Password12!" - }, - "Features": { - "DatabaseProvider": "Sqlite" + "SqlServer": "Server=localhost;Database=elsa;User Id=sa;Password=Password12!", + "PostgreSql": "Server=localhost;Username=elsa;Database=elsa;Port=5432;Password=elsa;SSLMode=Prefer;MaxPoolSize=2000;Timeout=60" }, + "DatabaseProvider": "Sqlite", "Hosting": { "BaseUrl": "https://localhost:8080", "BasePath": "" diff --git a/src/modules/Elsa.Agents.Persistence.EntityFrameworkCore.PostgreSql/PostgreSqlProvidersExtensions.cs b/src/modules/Elsa.Agents.Persistence.EntityFrameworkCore.PostgreSql/PostgreSqlProvidersExtensions.cs index 103b6bb0b..b8cccd4b0 100644 --- a/src/modules/Elsa.Agents.Persistence.EntityFrameworkCore.PostgreSql/PostgreSqlProvidersExtensions.cs +++ b/src/modules/Elsa.Agents.Persistence.EntityFrameworkCore.PostgreSql/PostgreSqlProvidersExtensions.cs @@ -14,7 +14,7 @@ public static class AgentsPostgreSqlProvidersExtensions /// /// Configures the feature to use SQL Server. /// - public static EFCoreAgentPersistenceFeature UseSqlServer(this EFCoreAgentPersistenceFeature feature, string connectionString, ElsaDbContextOptions? options = null) + public static EFCoreAgentPersistenceFeature UsePostgreSql(this EFCoreAgentPersistenceFeature feature, string connectionString, ElsaDbContextOptions? options = null) { feature.UsePostgreSql(Assembly, connectionString, options); return feature;