@namespace Oqtane.Modules.Admin.Sites @using Oqtane.Interfaces @using System.Text.RegularExpressions @inherits ModuleBase @inject NavigationManager NavigationManager @inject ITenantService TenantService @inject IAliasService AliasService @inject ISiteService SiteService @inject IThemeService ThemeService @inject ISiteTemplateService SiteTemplateService @inject IUserService UserService @inject IInstallationService InstallationService @inject IDatabaseService DatabaseService @inject IStringLocalizer Localizer @inject IStringLocalizer SharedLocalizer @if (_tenants == null) {

@SharedLocalizer["Loading"]

} else {
@if (_tenantid == "+") {

@if (_databases != null) {
@if (!_showConnectionString) { } else { }
}
@if (!_showConnectionString) { if (_databaseConfigType != null) { @DatabaseConfigComponent } } else {
}
}


@SharedLocalizer["Cancel"]
} @code { private List _databases; private ElementReference form; private bool validated = false; private string _databaseName; private Type _databaseConfigType; private object _databaseConfig; private RenderFragment DatabaseConfigComponent { get; set; } private bool _showConnectionString = false; private string _connectionString = string.Empty; private List _themeList; private List _themes = new List(); private List _containers = new List(); private List _siteTemplates; private List _tenants; private string _tenantid = "-"; private string _tenantName = string.Empty; private string _hostusername = string.Empty; private string _hostpassword = string.Empty; private string _name = string.Empty; private string _urls = string.Empty; private string _themetype = "-"; private string _containertype = "-"; private string _admincontainertype = ""; private string _sitetemplatetype = "-"; private string _runtime = "Server"; private string _prerender = "Prerendered"; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; protected override async Task OnInitializedAsync() { _tenants = await TenantService.GetTenantsAsync(); _urls = PageState.Alias.Name; _themeList = await ThemeService.GetThemesAsync(); _themes = ThemeService.GetThemeControls(_themeList); _siteTemplates = await SiteTemplateService.GetSiteTemplatesAsync(); _databases = await DatabaseService.GetDatabasesAsync(); if (_databases.Exists(item => item.IsDefault)) { _databaseName = _databases.Find(item => item.IsDefault).Name; } else { _databaseName = "LocalDB"; } LoadDatabaseConfigComponent(); } private void DatabaseChanged(ChangeEventArgs eventArgs) { try { _databaseName = (string)eventArgs.Value; _showConnectionString = false; LoadDatabaseConfigComponent(); } catch { AddModuleMessage(Localizer["Error.Database.LoadConfig"], MessageType.Error); } } private void LoadDatabaseConfigComponent() { var database = _databases.SingleOrDefault(d => d.Name == _databaseName); if (database != null) { _databaseConfigType = Type.GetType(database.ControlType); DatabaseConfigComponent = builder => { builder.OpenComponent(0, _databaseConfigType); builder.AddComponentReferenceCapture(1, inst => { _databaseConfig = Convert.ChangeType(inst, _databaseConfigType); }); builder.CloseComponent(); }; } } private void TenantChanged(ChangeEventArgs e) { _tenantid = (string)e.Value; if (string.IsNullOrEmpty(_tenantName)) { _tenantName = _name; } StateHasChanged(); } private async void ThemeChanged(ChangeEventArgs e) { try { _themetype = (string)e.Value; if (_themetype != "-") { _containers = ThemeService.GetContainerControls(_themeList, _themetype); _containertype = _containers.First().TypeName; } else { _containers = new List(); _containertype = "-"; } _admincontainertype = ""; StateHasChanged(); } catch (Exception ex) { await logger.LogError(ex, "Error Loading Containers For Theme {ThemeType} {Error}", _themetype, ex.Message); AddModuleMessage(Localizer["Error.Theme.LoadContainers"], MessageType.Error); } } private async Task SaveSite() { validated = true; var interop = new Interop(JSRuntime); if (await interop.FormValid(form)) { if (_tenantid != "-" && _name != string.Empty && _urls != string.Empty && _themetype != "-" && _containertype != "-" && _sitetemplatetype != "-") { _urls = Regex.Replace(_urls, @"\r\n?|\n", ","); var duplicates = new List(); var aliases = await AliasService.GetAliasesAsync(); foreach (string name in _urls.Split(',', StringSplitOptions.RemoveEmptyEntries)) { if (aliases.Exists(item => item.Name == name)) { duplicates.Add(name); } } if (duplicates.Count == 0) { InstallConfig config = new InstallConfig(); if (_tenantid == "+") { if (!string.IsNullOrEmpty(_tenantName) && !_tenants.Exists(item => item.Name == _tenantName)) { // validate host credentials var user = new User(); user.SiteId = PageState.Site.SiteId; user.Username = _hostusername; user.Password = _hostpassword; user.LastIPAddress = PageState.RemoteIPAddress; user = await UserService.LoginUserAsync(user, false, false); if (user.IsAuthenticated) { var database = _databases.SingleOrDefault(d => d.Name == _databaseName); var connectionString = String.Empty; if (_showConnectionString) { connectionString = _connectionString; } else { if (_databaseConfig is IDatabaseConfigControl databaseConfigControl) { connectionString = databaseConfigControl.GetConnectionString(); } } if (connectionString != "") { config.TenantName = _tenantName; config.DatabaseType = database.DBType; config.ConnectionString = connectionString; config.HostUsername = _hostusername; config.HostPassword = _hostpassword; config.HostEmail = user.Email; config.HostName = user.DisplayName; config.IsNewTenant = true; } else { AddModuleMessage(Localizer["Error.Required.ServerDatabase"], MessageType.Error); } } else { AddModuleMessage(Localizer["Error.InvalidPassword"], MessageType.Error); } } else { AddModuleMessage(Localizer["Error.TenantName.Exists"], MessageType.Error); } } else { var tenant = _tenants.FirstOrDefault(item => item.TenantId == int.Parse(_tenantid)); if (tenant != null) { config.TenantName = tenant.Name; config.DatabaseType = tenant.DBType; config.ConnectionString = tenant.DBConnectionString; config.IsNewTenant = false; } } if (!string.IsNullOrEmpty(config.TenantName)) { config.SiteName = _name; config.Aliases = _urls; config.DefaultTheme = _themetype; config.DefaultContainer = _containertype; config.DefaultAdminContainer = _admincontainertype; config.SiteTemplate = _sitetemplatetype; config.Runtime = _runtime; config.RenderMode = _runtime + _prerender; ShowProgressIndicator(); var installation = await InstallationService.Install(config); if (installation.Success) { var aliasname = config.Aliases.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)[0]; NavigationManager.NavigateTo(PageState.Uri.Scheme + "://" + aliasname, true); } else { await logger.LogError("Error Creating Site {Error}", installation.Message); AddModuleMessage(installation.Message, MessageType.Error); } } } else { AddModuleMessage(string.Format(Localizer["Message.SiteName.InUse"], string.Join(", ", duplicates.ToArray())), MessageType.Warning); } } else { AddModuleMessage(Localizer["Message.Required.Tenant"], MessageType.Warning); } } else { AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning); } } private void ToggleConnectionString() { if (_databaseConfig is IDatabaseConfigControl databaseConfigControl) { _connectionString = databaseConfigControl.GetConnectionString(); } _showConnectionString = !_showConnectionString; } }