diff --git a/Oqtane.Client/Installer/Controls/LocalDBConfig.razor b/Oqtane.Client/Installer/Controls/LocalDBConfig.razor new file mode 100644 index 00000000..9080675b --- /dev/null +++ b/Oqtane.Client/Installer/Controls/LocalDBConfig.razor @@ -0,0 +1,63 @@ +@namespace Oqtane.Installer.Controls + +@using System.ComponentModel.Design.Serialization +@implements Oqtane.Interfaces.IDatabaseConfigControl + +@inject IStringLocalizer Localizer + +@{ + foreach (var field in _connectionStringFields) + { + var fieldId = field.Name.ToLowerInvariant(); + field.Value = field.Value.Replace("{{Date}}", DateTime.UtcNow.ToString("yyyyMMddHHmm")); + + if (IsInstaller) + { + + + + + + + + + } + else + { + + + + + + + + + } + } +} + +@code { + [Parameter] + public bool IsInstaller { get; set; } + + private readonly List _connectionStringFields = new() + { + new() {Name = "Server", FriendlyName = "Server", Value = "(LocalDb)\\MSSQLLocalDB", HelpText="Enter the database server"}, + new() {Name = "Database", FriendlyName = "Database", Value = "Oqtane-{{Date}}", HelpText="Enter the name of the database"} + }; + + public string GetConnectionString() + { + var connectionString = String.Empty; + + var server = _connectionStringFields[0].Value; + var database = _connectionStringFields[1].Value; + + if (!String.IsNullOrEmpty(server) && !String.IsNullOrEmpty(database)) + { + connectionString = $"Data Source={server};AttachDbFilename=|DataDirectory|\\{database}.mdf;Initial Catalog={database};Integrated Security=SSPI;"; + } + + return connectionString; + } +} \ No newline at end of file diff --git a/Oqtane.Client/Installer/Controls/MySQLConfig.razor b/Oqtane.Client/Installer/Controls/MySQLConfig.razor new file mode 100644 index 00000000..8655e0fd --- /dev/null +++ b/Oqtane.Client/Installer/Controls/MySQLConfig.razor @@ -0,0 +1,73 @@ +@namespace Oqtane.Installer.Controls + +@implements Oqtane.Interfaces.IDatabaseConfigControl + +@inject IStringLocalizer Localizer + +@{ + foreach (var field in _connectionStringFields) + { + var fieldId = field.Name.ToLowerInvariant(); + var fieldType = (field.Name == "Pwd") ? "password" : "text"; + field.Value = field.Value.Replace("{{Date}}", DateTime.UtcNow.ToString("yyyyMMddHHmm")); + + if (IsInstaller) + { + + + + + + + + + } + else + { + + + + + + + + + } + } +} + +@code { + [Parameter] + public bool IsInstaller { get; set; } + + private readonly List _connectionStringFields = new() + { + new() {Name = "Server", FriendlyName = "Server", Value = "127.0.0.1", HelpText="Enter the database server"}, + new() {Name = "Port", FriendlyName = "Port", Value = "3306", HelpText="Enter the port used to connect to the server"}, + new() {Name = "Database", FriendlyName = "Database", Value = "Oqtane-{{Date}}", HelpText="Enter the name of the database"}, + new() {Name = "Uid", FriendlyName = "User Id", Value = "", HelpText="Enter the username to use for the database"}, + new() {Name = "Pwd", FriendlyName = "Password", Value = "", HelpText="Enter the password to use for the database"} + }; + + public string GetConnectionString() + { + var connectionString = String.Empty; + + var server = _connectionStringFields[0].Value; + var port = _connectionStringFields[1].Value; + var database = _connectionStringFields[2].Value; + var userId = _connectionStringFields[3].Value; + var password = _connectionStringFields[4].Value; + + if (!String.IsNullOrEmpty(server) && !String.IsNullOrEmpty(database) && !String.IsNullOrEmpty(userId) && !String.IsNullOrEmpty(password)) + { + connectionString = $"Server={server};Database={database};Uid={userId};Pwd={password};"; + } + + if (!String.IsNullOrEmpty(port)) + { + connectionString += $"Port={port};"; + } + return connectionString; + } +} \ No newline at end of file diff --git a/Oqtane.Client/Installer/Controls/PostgreSQLConfig.razor b/Oqtane.Client/Installer/Controls/PostgreSQLConfig.razor new file mode 100644 index 00000000..93f72576 --- /dev/null +++ b/Oqtane.Client/Installer/Controls/PostgreSQLConfig.razor @@ -0,0 +1,131 @@ +@namespace Oqtane.Installer.Controls + +@implements Oqtane.Interfaces.IDatabaseConfigControl + +@inject IStringLocalizer Localizer + +@{ + foreach (var field in _connectionStringFields) + { + var fieldId = field.Name.ToLowerInvariant(); + if (field.Name != "IntegratedSecurity") + { + var isVisible = ""; + var fieldType = (field.Name == "Pwd") ? "password" : "text"; + if ((field.Name == "Uid" || field.Name == "Pwd") ) + { + var intSecurityField = _connectionStringFields.Single(f => f.Name == "IntegratedSecurity"); + if (intSecurityField != null) + { + isVisible = (Convert.ToBoolean(intSecurityField.Value)) ? "display: none;" : ""; + } + } + + field.Value = field.Value.Replace("{{Date}}", DateTime.UtcNow.ToString("yyyyMMddHHmm")); + + if (IsInstaller) + { + + + + + + + + + } + else + { + + + + + + + + + } + } + else + { + if (IsInstaller) + { + + + + + + + + + } + else + { + + + + + + + + + } + } + } +} + +@code { + [Parameter] + public bool IsInstaller { get; set; } + + private readonly List _connectionStringFields = new() + { + new() {Name = "Server", FriendlyName = "Server", Value = "127.0.0.1", HelpText="Enter the database server"}, + new() {Name = "Port", FriendlyName = "Port", Value = "5432", HelpText="Enter the port used to connect to the server"}, + new() {Name = "Database", FriendlyName = "Database", Value = "Oqtane-{{Date}}", HelpText="Enter the name of the database"}, + new() {Name = "IntegratedSecurity", FriendlyName = "Integrated Security", Value = "true", HelpText="Select if you want integrated security or not"}, + new() {Name = "Uid", FriendlyName = "User Id", Value = "", HelpText="Enter the username to use for the database"}, + new() {Name = "Pwd", FriendlyName = "Password", Value = "", HelpText="Enter the password to use for the database"} + }; + + public string GetConnectionString() + { + var connectionString = String.Empty; + + var server = _connectionStringFields[0].Value; + var port = _connectionStringFields[1].Value; + var database = _connectionStringFields[2].Value; + var integratedSecurity = Boolean.Parse(_connectionStringFields[3].Value); + var userId = _connectionStringFields[4].Value; + var password = _connectionStringFields[5].Value; + + if (!String.IsNullOrEmpty(server) && !String.IsNullOrEmpty(database) && !String.IsNullOrEmpty(port)) + { + connectionString = $"Server={server};Port={port};Database={database};"; + } + + if (integratedSecurity) + { + connectionString += "Integrated Security=true;"; + } + else + { + if (!String.IsNullOrEmpty(userId) && !String.IsNullOrEmpty(password)) + { + connectionString += $"User ID={userId};Password={password};"; + } + else + { + connectionString = String.Empty; + } + } + + return connectionString; + } +} \ No newline at end of file diff --git a/Oqtane.Client/Installer/Controls/SqlServerConfig.razor b/Oqtane.Client/Installer/Controls/SqlServerConfig.razor new file mode 100644 index 00000000..3fdbd0c7 --- /dev/null +++ b/Oqtane.Client/Installer/Controls/SqlServerConfig.razor @@ -0,0 +1,131 @@ +@namespace Oqtane.Installer.Controls + +@implements Oqtane.Interfaces.IDatabaseConfigControl + +@inject IStringLocalizer Localizer + +@{ + foreach (var field in _connectionStringFields) + { + var fieldId = field.Name.ToLowerInvariant(); + if (field.Name != "IntegratedSecurity") + { + var isVisible = ""; + var fieldType = (field.Name == "Pwd") ? "password" : "text"; + if ((field.Name == "Uid" || field.Name == "Pwd") ) + { + var intSecurityField = _connectionStringFields.Single(f => f.Name == "IntegratedSecurity"); + if (intSecurityField != null) + { + isVisible = (Convert.ToBoolean(intSecurityField.Value)) ? "display: none;" : ""; + } + } + + field.Value = field.Value.Replace("{{Date}}", DateTime.UtcNow.ToString("yyyyMMddHHmm")); + + if (IsInstaller) + { + + + + + + + + + } + else + { + + + + + + + + + } + } + else + { + if (IsInstaller) + { + + + + + + + + + } + else + { + + + + + + + + + } + } + } +} + +@code { + + [Parameter] + public bool IsInstaller { get; set; } + + private readonly List _connectionStringFields = new() + { + new() {Name = "Server", FriendlyName = "Server", Value = ".", HelpText="Enter the database server"}, + new() {Name = "Database", FriendlyName = "Database", Value = "Oqtane-{{Date}}", HelpText="Enter the name of the database"}, + new() {Name = "IntegratedSecurity", FriendlyName = "Integrated Security", Value = "true", HelpText="Select if you want integrated security or not"}, + new() {Name = "Uid", FriendlyName = "User Id", Value = "", HelpText="Enter the username to use for the database"}, + new() {Name = "Pwd", FriendlyName = "Password", Value = "", HelpText="Enter the password to use for the database"} + }; + + public string GetConnectionString() + { + var connectionString = String.Empty; + + var server = _connectionStringFields[0].Value; + var database = _connectionStringFields[1].Value; + var integratedSecurity = Boolean.Parse(_connectionStringFields[2].Value); + var userId = _connectionStringFields[3].Value; + var password = _connectionStringFields[4].Value; + + if (!String.IsNullOrEmpty(server) && !String.IsNullOrEmpty(database)) + { + connectionString = $"Data Source={server};Initial Catalog={database};"; + } + + if (integratedSecurity) + { + connectionString += "Integrated Security=SSPI;"; + } + else + { + if (!String.IsNullOrEmpty(userId) && !String.IsNullOrEmpty(password)) + { + connectionString += $"User ID={userId};Password={password};"; + } + else + { + connectionString = String.Empty; + } + } + + return connectionString; + } + +} \ No newline at end of file diff --git a/Oqtane.Client/Installer/Controls/SqliteConfig.razor b/Oqtane.Client/Installer/Controls/SqliteConfig.razor new file mode 100644 index 00000000..23682365 --- /dev/null +++ b/Oqtane.Client/Installer/Controls/SqliteConfig.razor @@ -0,0 +1,60 @@ +@namespace Oqtane.Installer.Controls + +@implements Oqtane.Interfaces.IDatabaseConfigControl + +@inject IStringLocalizer Localizer + +@{ + foreach (var field in _connectionStringFields) + { + var fieldId = field.Name.ToLowerInvariant(); + field.Value = field.Value.Replace("{{Date}}", DateTime.UtcNow.ToString("yyyyMMddHHmm")); + + if (IsInstaller) + { + + + + + + + + + } + else + { + + + + + + + + + } + } +} + +@code { + [Parameter] + public bool IsInstaller { get; set; } + + private readonly List _connectionStringFields = new() + { + new() {Name = "Server", FriendlyName = "File Name", Value = "Oqtane-{{Date}}.db", HelpText="Enter the file name to use for the database"} + }; + + public string GetConnectionString() + { + var connectionstring = String.Empty; + + var server = _connectionStringFields[0].Value; + + if (!String.IsNullOrEmpty(server)) + { + connectionstring = $"Data Source={server};"; + } + + return connectionstring; + } +} \ No newline at end of file diff --git a/Oqtane.Client/UI/Installer.razor b/Oqtane.Client/Installer/Installer.razor similarity index 60% rename from Oqtane.Client/UI/Installer.razor rename to Oqtane.Client/Installer/Installer.razor index 3c013711..4ee19850 100644 --- a/Oqtane.Client/UI/Installer.razor +++ b/Oqtane.Client/Installer/Installer.razor @@ -1,13 +1,13 @@ +@namespace Oqtane.Installer @using Oqtane.Interfaces -@using System.Reflection -@namespace Oqtane.UI +@using Oqtane.Installer.Controls + @inject NavigationManager NavigationManager @inject IInstallationService InstallationService @inject ISiteService SiteService @inject IUserService UserService @inject IJSRuntime JSRuntime @inject IStringLocalizer Localizer -@inject IEnumerable Databases
@@ -22,63 +22,23 @@

@Localizer["Database Configuration"]


- - - - - @{ - _selectedDatabase = Databases.Single(d => d.Name == _databaseType); - foreach (var field in _selectedDatabase.ConnectionStringFields) - { - if (field.Name != "IntegratedSecurity") - { - var isVisible = ""; - var fieldType = (field.Name == "Pwd") ? "password" : "text"; - if ((field.Name == "Uid" || field.Name == "Pwd") && _selectedDatabase.Name != "MySQL" ) + + + - - - - } - else - { - - - - - } + + + + @{ + if (_databaseConfigType != null) + { + @DatabaseConfigComponent; } } @@ -135,8 +95,12 @@ @code { - private IOqtaneDatabase _selectedDatabase; - private string _databaseType = "LocalDB"; + private IList _databases; + private string _databaseName = "LocalDB"; + private Type _databaseConfigType; + private object _databaseConfig; + private RenderFragment DatabaseConfigComponent { get; set; } + private string _hostUsername = UserNames.Host; private string _hostPassword = string.Empty; private string _confirmPassword = string.Empty; @@ -144,6 +108,77 @@ private string _message = string.Empty; private string _loadingDisplay = "display: none;"; + protected override void OnInitialized() + { + base.OnInitialized(); + + _databases = new List + { + new() + { + Name = "LocalDB", + FriendlyName = "Local Database", + Type = "Oqtane.Installer.Controls.LocalDBConfig, Oqtane.Client" + }, + new() + { + Name = "SqlServer", + FriendlyName = "SQL Server", + Type = "Oqtane.Installer.Controls.SqlServerConfig, Oqtane.Client" + }, + new() + { + Name = "Sqlite", + FriendlyName = "Sqlite", + Type = "Oqtane.Installer.Controls.SqliteConfig, Oqtane.Client" + }, + new() + { + Name = "MySQL", + FriendlyName = "MySQL", + Type = "Oqtane.Installer.Controls.MySQLConfig, Oqtane.Client" + }, + new() + { + Name = "PostgreSQL", + FriendlyName = "PostgreSQL", + Type = "Oqtane.Installer.Controls.PostgreSQLConfig, Oqtane.Client" + } + }; + + LoadDatabaseConfigComponent(); + } + + private void DatabaseChanged(ChangeEventArgs eventArgs) + { + try + { + _databaseName = (string)eventArgs.Value; + + LoadDatabaseConfigComponent(); + } + catch (Exception exception) + { + _message = Localizer["Error loading Database Configuration Control"]; + } + } + + private void LoadDatabaseConfigComponent() + { + var database = _databases.SingleOrDefault(d => d.Name == _databaseName); + if (database != null) + { + _databaseConfigType = Type.GetType(database.Type); + DatabaseConfigComponent = builder => + { + builder.OpenComponent(0, _databaseConfigType); + builder.AddAttribute(1, "IsInstaller", true); + builder.AddComponentReferenceCapture(2, inst => { _databaseConfig = Convert.ChangeType(inst, _databaseConfigType); }); + builder.CloseComponent(); + }; + } + } + protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) @@ -155,7 +190,11 @@ private async Task Install() { - var connectionString = _selectedDatabase.BuildConnectionString(); + var connectionString = String.Empty; + if (_databaseConfig is IDatabaseConfigControl databaseConfigControl) + { + connectionString = databaseConfigControl.GetConnectionString(); + } if (connectionString != "" && _hostUsername != "" && _hostPassword.Length >= 6 && _hostPassword == _confirmPassword && _hostEmail != "") { @@ -166,7 +205,7 @@ var config = new InstallConfig { - DatabaseType = _databaseType, + DatabaseType = _databaseName, ConnectionString = connectionString, Aliases = uri.Authority, HostEmail = _hostEmail, diff --git a/Oqtane.Client/Modules/Admin/Sites/Add.razor b/Oqtane.Client/Modules/Admin/Sites/Add.razor index c77bdca9..4d49474f 100644 --- a/Oqtane.Client/Modules/Admin/Sites/Add.razor +++ b/Oqtane.Client/Modules/Admin/Sites/Add.razor @@ -127,60 +127,17 @@ else + if (_databaseConfigType != null) { - _selectedDatabase = Databases.Single(d => d.Name == _databaseType); - foreach (var field in _selectedDatabase.ConnectionStringFields) - { - var fieldId = field.Name.ToLowerInvariant(); - if (field.Name != "IntegratedSecurity") - { - var isVisible = ""; - var fieldType = (field.Name == "Pwd") ? "password" : "text"; - if ((field.Name == "Uid" || field.Name == "Pwd") && _selectedDatabase.Name != "MySQL" ) - { - var intSecurityField = _selectedDatabase.ConnectionStringFields.Single(f => f.Name == "IntegratedSecurity"); - if (intSecurityField != null) - { - isVisible = (Convert.ToBoolean(intSecurityField.Value)) ? "display: none;" : ""; - } - } - - field.Value = field.Value.Replace("{{Date}}", DateTime.UtcNow.ToString("yyyyMMddHHmm")); - - - - - - } - else - { - - - - - } - } + @DatabaseConfigComponent; }
- - - -
+ + +
- - - -
- - - -
- + @foreach (var database in _databases) + { + }
- - - -
- - - -
@@ -205,6 +162,13 @@ else } @code { + private IList _databases; + private string _databaseName = "LocalDB"; + private Type _databaseConfigType; + private object _databaseConfig; + private RenderFragment DatabaseConfigComponent { get; set; } + + private List _themeList; private List _themes = new List(); private List _containers = new List(); @@ -213,9 +177,7 @@ else private string _tenantid = "-"; private string _tenantName = string.Empty; - private IOqtaneDatabase _selectedDatabase; - private string _databaseType = "LocalDB"; - + private string _hostUserName = UserNames.Host; private string _hostpassword = string.Empty; @@ -235,6 +197,72 @@ else _themeList = await ThemeService.GetThemesAsync(); _themes = ThemeService.GetThemeControls(_themeList); _siteTemplates = await SiteTemplateService.GetSiteTemplatesAsync(); + + _databases = new List + { + new() + { + Name = "LocalDB", + FriendlyName = "Local Database", + Type = "Oqtane.Installer.Controls.LocalDBConfig, Oqtane.Client" + }, + new() + { + Name = "SqlServer", + FriendlyName = "SQL Server", + Type = "Oqtane.Installer.Controls.SqlServerConfig, Oqtane.Client" + }, + new() + { + Name = "Sqlite", + FriendlyName = "Sqlite", + Type = "Oqtane.Installer.Controls.SqliteConfig, Oqtane.Client" + }, + new() + { + Name = "MySQL", + FriendlyName = "MySQL", + Type = "Oqtane.Installer.Controls.MySQLConfig, Oqtane.Client" + }, + new() + { + Name = "PostgreSQL", + FriendlyName = "PostgreSQL", + Type = "Oqtane.Installer.Controls.PostGreSQLConfig, Oqtane.Client" + } + }; + + LoadDatabaseConfigComponent(); + } + + private void DatabaseChanged(ChangeEventArgs eventArgs) + { + try + { + _databaseName = (string)eventArgs.Value; + + LoadDatabaseConfigComponent(); + } + catch (Exception exception) + { + AddModuleMessage(Localizer["Error loading Database Configuration Control"], MessageType.Error); + } + } + + private void LoadDatabaseConfigComponent() + { + var database = _databases.SingleOrDefault(d => d.Name == _databaseName); + if (database != null) + { + _databaseConfigType = Type.GetType(database.Type); + DatabaseConfigComponent = builder => + { + builder.OpenComponent(0, _databaseConfigType); + builder.AddAttribute(1, "IsInstaller", false); + builder.AddComponentReferenceCapture(2, inst => { _databaseConfig = Convert.ChangeType(inst, _databaseConfigType); }); + builder.CloseComponent(); + }; + } } private void TenantChanged(ChangeEventArgs e) @@ -301,10 +329,14 @@ else user = await UserService.LoginUserAsync(user, false, false); if (user.IsAuthenticated) { - var connectionString = _selectedDatabase.BuildConnectionString(); + var connectionString = String.Empty; + if (_databaseConfig is IDatabaseConfigControl databaseConfigControl) + { + connectionString = databaseConfigControl.GetConnectionString(); + } if (connectionString != "") { - config.DatabaseType = _databaseType; + config.DatabaseType = _databaseName; config.ConnectionString = connectionString; config.HostPassword = _hostpassword; config.HostEmail = user.Email; diff --git a/Oqtane.Client/Program.cs b/Oqtane.Client/Program.cs index fdc5145f..3ce0058f 100644 --- a/Oqtane.Client/Program.cs +++ b/Oqtane.Client/Program.cs @@ -86,17 +86,6 @@ namespace Oqtane.Client } } - // dynamically register database providers - var databaseTypes = assembly.GetInterfaces(); - foreach (var databaseType in databaseTypes) - { - if (databaseType.AssemblyQualifiedName != null) - { - var serviceType = Type.GetType("Oqtane.Interfaces.IDatabase, Oqtane.Shared"); - builder.Services.AddScoped(serviceType ?? databaseType, databaseType); - } - } - // register client startup services var startUps = assembly.GetInstances(); foreach (var startup in startUps) diff --git a/Oqtane.Client/_Imports.razor b/Oqtane.Client/_Imports.razor index 7afebdf1..cbf43e76 100644 --- a/Oqtane.Client/_Imports.razor +++ b/Oqtane.Client/_Imports.razor @@ -21,3 +21,4 @@ @using Oqtane.Themes.Controls @using Oqtane.UI @using Oqtane.Enums +@using Oqtane.Installer diff --git a/Oqtane.Database.MySQL/MySQLDatabase.cs b/Oqtane.Database.MySQL/MySQLDatabase.cs index 3e988aab..1998d7b8 100644 --- a/Oqtane.Database.MySQL/MySQLDatabase.cs +++ b/Oqtane.Database.MySQL/MySQLDatabase.cs @@ -15,16 +15,7 @@ namespace Oqtane.Database.MySQL private static string _name => "MySQL"; - private static readonly List _connectionStringFields = new() - { - new() {Name = "Server", FriendlyName = "Server", Value = "127.0.0.1", HelpText="Enter the database server"}, - new() {Name = "Port", FriendlyName = "Port", Value = "3306", HelpText="Enter the port used to connect to the server"}, - new() {Name = "Database", FriendlyName = "Database", Value = "Oqtane-{{Date}}", HelpText="Enter the name of the database"}, - new() {Name = "Uid", FriendlyName = "User Id", Value = "", HelpText="Enter the username to use for the database"}, - new() {Name = "Pwd", FriendlyName = "Password", Value = "", HelpText="Enter the password to use for the database"} - }; - - public MySQLDatabase() :base(_name, _friendlyName, _connectionStringFields) { } + public MySQLDatabase() :base(_name, _friendlyName) { } public override string Provider => "MySql.EntityFrameworkCore"; @@ -33,28 +24,6 @@ namespace Oqtane.Database.MySQL return table.Column(name: name, nullable: false).Annotation("MySQL:ValueGenerationStrategy", MySQLValueGenerationStrategy.IdentityColumn); } - public override string BuildConnectionString() - { - var connectionString = String.Empty; - - var server = ConnectionStringFields[0].Value; - var port = ConnectionStringFields[1].Value; - var database = ConnectionStringFields[2].Value; - var userId = ConnectionStringFields[3].Value; - var password = ConnectionStringFields[4].Value; - - if (!String.IsNullOrEmpty(server) && !String.IsNullOrEmpty(database) && !String.IsNullOrEmpty(userId) && !String.IsNullOrEmpty(password)) - { - connectionString = $"Server={server};Database={database};Uid={userId};Pwd={password};"; - } - - if (!String.IsNullOrEmpty(port)) - { - connectionString += $"Port={port};"; - } - return connectionString; - } - public override string ConcatenateSql(params string[] values) { var returnValue = "CONCAT("; diff --git a/Oqtane.Database.PostgreSQL/PostgreSQLDatabase.cs b/Oqtane.Database.PostgreSQL/PostgreSQLDatabase.cs index 8d50debd..d3284232 100644 --- a/Oqtane.Database.PostgreSQL/PostgreSQLDatabase.cs +++ b/Oqtane.Database.PostgreSQL/PostgreSQLDatabase.cs @@ -20,17 +20,7 @@ namespace Oqtane.Database.PostgreSQL private readonly INameRewriter _rewriter; - private static readonly List _connectionStringFields = new() - { - new() {Name = "Server", FriendlyName = "Server", Value = "127.0.0.1", HelpText="Enter the database server"}, - new() {Name = "Port", FriendlyName = "Port", Value = "5432", HelpText="Enter the port used to connect to the server"}, - new() {Name = "Database", FriendlyName = "Database", Value = "Oqtane-{{Date}}", HelpText="Enter the name of the database"}, - new() {Name = "IntegratedSecurity", FriendlyName = "Integrated Security", Value = "true", HelpText="Select if you want integrated security or not"}, - new() {Name = "Uid", FriendlyName = "User Id", Value = "", HelpText="Enter the username to use for the database"}, - new() {Name = "Pwd", FriendlyName = "Password", Value = "", HelpText="Enter the password to use for the database"} - }; - - public PostgreSQLDatabase() : base(_name, _friendlyName, _connectionStringFields) + public PostgreSQLDatabase() : base(_name, _friendlyName) { _rewriter = new SnakeCaseNameRewriter(CultureInfo.InvariantCulture); } @@ -42,41 +32,6 @@ namespace Oqtane.Database.PostgreSQL return table.Column(name: name, nullable: false).Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityAlwaysColumn); } - public override string BuildConnectionString() - { - var connectionString = String.Empty; - - var server = ConnectionStringFields[0].Value; - var port = ConnectionStringFields[1].Value; - var database = ConnectionStringFields[2].Value; - var integratedSecurity = Boolean.Parse(ConnectionStringFields[3].Value); - var userId = ConnectionStringFields[4].Value; - var password = ConnectionStringFields[5].Value; - - if (!String.IsNullOrEmpty(server) && !String.IsNullOrEmpty(database) && !String.IsNullOrEmpty(port)) - { - connectionString = $"Server={server};Port={port};Database={database};"; - } - - if (integratedSecurity) - { - connectionString += "Integrated Security=true;"; - } - else - { - if (!String.IsNullOrEmpty(userId) && !String.IsNullOrEmpty(password)) - { - connectionString += $"User ID={userId};Password={password};"; - } - else - { - connectionString = String.Empty; - } - } - - return connectionString; - } - public override string ConcatenateSql(params string[] values) { var returnValue = String.Empty; diff --git a/Oqtane.Database.Sqlite/SqliteDatabase.cs b/Oqtane.Database.Sqlite/SqliteDatabase.cs index 50b901d0..655e6cdb 100644 --- a/Oqtane.Database.Sqlite/SqliteDatabase.cs +++ b/Oqtane.Database.Sqlite/SqliteDatabase.cs @@ -14,12 +14,7 @@ namespace Oqtane.Repository.Databases private static string _name => "Sqlite"; - private static readonly List _connectionStringFields = new() - { - new() {Name = "Server", FriendlyName = "File Name", Value = "Oqtane-{{Date}}.db", HelpText="Enter the file name to use for the database"} - }; - - public SqliteDatabase() :base(_name, _friendlyName, _connectionStringFields) { } + public SqliteDatabase() :base(_name, _friendlyName) { } public override string Provider => "Microsoft.EntityFrameworkCore.Sqlite"; @@ -28,20 +23,6 @@ namespace Oqtane.Repository.Databases return table.Column(name: name, nullable: false).Annotation("Sqlite:Autoincrement", true); } - public override string BuildConnectionString() - { - var connectionstring = String.Empty; - - var server = ConnectionStringFields[0].Value; - - if (!String.IsNullOrEmpty(server)) - { - connectionstring = $"Data Source={server};"; - } - - return connectionstring; - } - public override string ConcatenateSql(params string[] values) { var returnValue = String.Empty; diff --git a/Oqtane.Server/Databases/LocalDbDatabase.cs b/Oqtane.Server/Databases/LocalDbDatabase.cs index 77be3035..e70010ae 100644 --- a/Oqtane.Server/Databases/LocalDbDatabase.cs +++ b/Oqtane.Server/Databases/LocalDbDatabase.cs @@ -10,27 +10,6 @@ namespace Oqtane.Databases private static string _friendlyName => "Local Database"; private static string _name => "LocalDB"; - private static readonly List _connectionStringFields = new() - { - new() {Name = "Server", FriendlyName = "Server", Value = "(LocalDb)\\MSSQLLocalDB", HelpText="Enter the database server"}, - new() {Name = "Database", FriendlyName = "Database", Value = "Oqtane-{{Date}}", HelpText="Enter the name of the database"} - }; - - public LocalDbDatabase() :base(_name, _friendlyName, _connectionStringFields) { } - - public override string BuildConnectionString() - { - var connectionString = String.Empty; - - var server = ConnectionStringFields[0].Value; - var database = ConnectionStringFields[1].Value; - - if (!String.IsNullOrEmpty(server) && !String.IsNullOrEmpty(database)) - { - connectionString = $"Data Source={server};AttachDbFilename=|DataDirectory|\\{database}.mdf;Initial Catalog={database};Integrated Security=SSPI;"; - } - - return connectionString; - } + public LocalDbDatabase() :base(_name, _friendlyName) { } } } diff --git a/Oqtane.Server/Databases/SqlServerDatabase.cs b/Oqtane.Server/Databases/SqlServerDatabase.cs index cfb852c3..669cc50a 100644 --- a/Oqtane.Server/Databases/SqlServerDatabase.cs +++ b/Oqtane.Server/Databases/SqlServerDatabase.cs @@ -13,50 +13,6 @@ namespace Oqtane.Databases private static string _name => "SqlServer"; - private static readonly List _connectionStringFields = new() - { - new() {Name = "Server", FriendlyName = "Server", Value = ".", HelpText="Enter the database server"}, - new() {Name = "Database", FriendlyName = "Database", Value = "Oqtane-{{Date}}", HelpText="Enter the name of the database"}, - new() {Name = "IntegratedSecurity", FriendlyName = "Integrated Security", Value = "true", HelpText="Select if you want integrated security or not"}, - new() {Name = "Uid", FriendlyName = "User Id", Value = "", HelpText="Enter the username to use for the database"}, - new() {Name = "Pwd", FriendlyName = "Password", Value = "", HelpText="Enter the password to use for the database"} - }; - - public SqlServerDatabase() :base(_name, _friendlyName, _connectionStringFields) { } - - public override string BuildConnectionString() - { - var connectionString = String.Empty; - - var server = ConnectionStringFields[0].Value; - var database = ConnectionStringFields[1].Value; - var integratedSecurity = Boolean.Parse(ConnectionStringFields[2].Value); - var userId = ConnectionStringFields[3].Value; - var password = ConnectionStringFields[4].Value; - - if (!String.IsNullOrEmpty(server) && !String.IsNullOrEmpty(database)) - { - connectionString = $"Data Source={server};Initial Catalog={database};"; - } - - if (integratedSecurity) - { - connectionString += "Integrated Security=SSPI;"; - } - else - { - if (!String.IsNullOrEmpty(userId) && !String.IsNullOrEmpty(password)) - { - connectionString += $"User ID={userId};Password={password};"; - } - else - { - connectionString = String.Empty; - } - } - - return connectionString; - - } + public SqlServerDatabase() :base(_name, _friendlyName) { } } } diff --git a/Oqtane.Server/Databases/SqlServerDatabaseBase.cs b/Oqtane.Server/Databases/SqlServerDatabaseBase.cs index 70d3de3a..afe1a762 100644 --- a/Oqtane.Server/Databases/SqlServerDatabaseBase.cs +++ b/Oqtane.Server/Databases/SqlServerDatabaseBase.cs @@ -11,7 +11,7 @@ namespace Oqtane.Repository.Databases { public abstract class SqlServerDatabaseBase : OqtaneDatabaseBase { - protected SqlServerDatabaseBase(string name, string friendlyName, List connectionStringFields) : base(name, friendlyName, connectionStringFields) + protected SqlServerDatabaseBase(string name, string friendlyName) : base(name, friendlyName) { } diff --git a/Oqtane.Shared/Interfaces/IDatabaseConfigControl.cs b/Oqtane.Shared/Interfaces/IDatabaseConfigControl.cs new file mode 100644 index 00000000..b9ab5159 --- /dev/null +++ b/Oqtane.Shared/Interfaces/IDatabaseConfigControl.cs @@ -0,0 +1,9 @@ +namespace Oqtane.Interfaces +{ + public interface IDatabaseConfigControl + { + string GetConnectionString(); + + bool IsInstaller { get; set; } + } +} diff --git a/Oqtane.Shared/Interfaces/IOqtaneDatabase.cs b/Oqtane.Shared/Interfaces/IOqtaneDatabase.cs index 225ccffd..ac31a5f8 100644 --- a/Oqtane.Shared/Interfaces/IOqtaneDatabase.cs +++ b/Oqtane.Shared/Interfaces/IOqtaneDatabase.cs @@ -14,12 +14,8 @@ namespace Oqtane.Interfaces public string Provider { get; } - public List ConnectionStringFields { get; } - public OperationBuilder AddAutoIncrementColumn(ColumnsBuilder table, string name); - public string BuildConnectionString(); - public string ConcatenateSql(params string[] values); public string RewriteName(string name); diff --git a/Oqtane.Shared/Models/Database.cs b/Oqtane.Shared/Models/Database.cs index e1855242..8cb27464 100644 --- a/Oqtane.Shared/Models/Database.cs +++ b/Oqtane.Shared/Models/Database.cs @@ -2,6 +2,8 @@ namespace Oqtane.Models { public class Database { + public string FriendlyName { get; set; } + public string Name { get; set; } public string Type { get; set; } diff --git a/Oqtane.Shared/Shared/OqtaneDatabaseBase.cs b/Oqtane.Shared/Shared/OqtaneDatabaseBase.cs index ff107ff5..5cbcc4bc 100644 --- a/Oqtane.Shared/Shared/OqtaneDatabaseBase.cs +++ b/Oqtane.Shared/Shared/OqtaneDatabaseBase.cs @@ -10,11 +10,10 @@ namespace Oqtane.Shared { public abstract class OqtaneDatabaseBase : IOqtaneDatabase { - protected OqtaneDatabaseBase(string name, string friendlyName, List connectionStringFields) + protected OqtaneDatabaseBase(string name, string friendlyName) { Name = name; FriendlyName = friendlyName; - ConnectionStringFields = connectionStringFields; } public string FriendlyName { get; } @@ -23,12 +22,8 @@ namespace Oqtane.Shared public abstract string Provider { get; } - public List ConnectionStringFields { get; } - public abstract OperationBuilder AddAutoIncrementColumn(ColumnsBuilder table, string name); - public abstract string BuildConnectionString(); - public virtual string ConcatenateSql(params string[] values) { var returnValue = String.Empty;