diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index 4e73d383..a2d6c815 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -154,10 +154,6 @@ Save Cancel - @if (UserSecurity.IsAuthorized(PageState.User, Constants.HostRole)) - { - - } @@ -202,7 +198,7 @@ { Themes = await ThemeService.GetThemesAsync(); aliases = await AliasService.GetAliasesAsync(); - Site site = await SiteService.GetSiteAsync(PageState.Site.SiteId); + Site site = await SiteService.GetSiteAsync(PageState.Site.SiteId, PageState.Alias); if (site != null) { name = site.Name; @@ -275,55 +271,70 @@ { if (name != "" && urls != "" && !string.IsNullOrEmpty(themetype) && (panelayouts.Count == 0 || !string.IsNullOrEmpty(layouttype)) && !string.IsNullOrEmpty(containertype)) { - Site site = await SiteService.GetSiteAsync(PageState.Site.SiteId); - if (site != null) + bool unique = true; + foreach (string name in urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { - site.Name = name; - site.LogoFileId = null; - int logofileid = filemanager.GetFileId(); - if (logofileid != -1) + if (aliases.Exists(item => item.Name == name && item.SiteId != PageState.Alias.SiteId && item.TenantId != PageState.Alias.TenantId)) { - site.LogoFileId = logofileid; + unique = false; } - site.DefaultThemeType = themetype; - site.DefaultLayoutType = (layouttype == null ? "" : layouttype); - site.DefaultContainerType = containertype; - site.IsDeleted = (isdeleted == null ? true : Boolean.Parse(isdeleted)); - - site = await SiteService.UpdateSiteAsync(site); - - urls = urls.Replace("\n", ","); - string[] names = urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - foreach (Alias alias in aliases) + } + if (unique) + { + Site site = await SiteService.GetSiteAsync(PageState.Site.SiteId, PageState.Alias); + if (site != null) { - if (!names.Contains(alias.Name)) + site.Name = name; + site.LogoFileId = null; + int logofileid = filemanager.GetFileId(); + if (logofileid != -1) { - await AliasService.DeleteAliasAsync(alias.AliasId); + site.LogoFileId = logofileid; } - } - foreach (string name in names) - { - if (!aliases.Exists(item => item.Name == name)) + site.DefaultThemeType = themetype; + site.DefaultLayoutType = (layouttype == null ? "" : layouttype); + site.DefaultContainerType = containertype; + site.IsDeleted = (isdeleted == null ? true : Boolean.Parse(isdeleted)); + + site = await SiteService.UpdateSiteAsync(site, PageState.Alias); + + urls = urls.Replace("\n", ","); + string[] names = urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + foreach (Alias alias in aliases.Where(item => item.SiteId == site.SiteId && item.TenantId == site.TenantId).ToList()) { - Alias alias = new Alias(); - alias.Name = name; - alias.TenantId = site.TenantId; - alias.SiteId = site.SiteId; - await AliasService.AddAliasAsync(alias); + if (!names.Contains(alias.Name)) + { + await AliasService.DeleteAliasAsync(alias.AliasId); + } } + foreach (string name in names) + { + if (!aliases.Exists(item => item.Name == name)) + { + Alias alias = new Alias(); + alias.Name = name; + alias.TenantId = site.TenantId; + alias.SiteId = site.SiteId; + await AliasService.AddAliasAsync(alias); + } + } + + Dictionary settings = await SettingService.GetSiteSettingsAsync(site.SiteId); + SettingService.SetSetting(settings, "SMTPHost", smtphost); + SettingService.SetSetting(settings, "SMTPPort", smtpport); + SettingService.SetSetting(settings, "SMTPSSL", smtpssl); + SettingService.SetSetting(settings, "SMTPUsername", smtpusername); + SettingService.SetSetting(settings, "SMTPPassword", smtppassword); + await SettingService.UpdateSiteSettingsAsync(settings, site.SiteId); + + await logger.LogInformation("Site Saved {Site}", site); + + NavigationManager.NavigateTo(NavigateUrl(Reload.Site)); } - - Dictionary settings = await SettingService.GetSiteSettingsAsync(site.SiteId); - SettingService.SetSetting(settings, "SMTPHost", smtphost); - SettingService.SetSetting(settings, "SMTPPort", smtpport); - SettingService.SetSetting(settings, "SMTPSSL", smtpssl); - SettingService.SetSetting(settings, "SMTPUsername", smtpusername); - SettingService.SetSetting(settings, "SMTPPassword", smtppassword); - await SettingService.UpdateSiteSettingsAsync(settings, site.SiteId); - - await logger.LogInformation("Site Saved {Site}", site); - - NavigationManager.NavigateTo(NavigateUrl(Reload.Site)); + } + else + { + AddModuleMessage("An Alias Specified Has Already Been Used For Another Site", MessageType.Warning); } } else @@ -337,19 +348,4 @@ AddModuleMessage("Error Saving Site", MessageType.Error); } } - - private async Task DeleteSite() - { - try - { - await SiteService.DeleteSiteAsync(PageState.Site.SiteId); - await logger.LogInformation("Sited Deleted {SiteId}", PageState.Site.SiteId); - StateHasChanged(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Deleting Site {SiteId} {Error}", PageState.Site.SiteId, ex.Message); - AddModuleMessage("Error Deleting Site", MessageType.Error); - } - } } diff --git a/Oqtane.Client/Modules/Admin/Sites/Add.razor b/Oqtane.Client/Modules/Admin/Sites/Add.razor index 7afb961f..36d08a26 100644 --- a/Oqtane.Client/Modules/Admin/Sites/Add.razor +++ b/Oqtane.Client/Modules/Admin/Sites/Add.razor @@ -187,75 +187,91 @@ else { if (tenantid != "-1" && name != "" && urls != "" && !string.IsNullOrEmpty(themetype) && (panelayouts.Count == 0 || !string.IsNullOrEmpty(layouttype)) && !string.IsNullOrEmpty(containertype)) { - bool isvalid = true; - - if (!isinitialized) + bool unique = true; + List aliases = await AliasService.GetAliasesAsync(); + foreach (string name in urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { - User user = new User(); - user.SiteId = PageState.Site.SiteId; - user.Username = username; - user.Password = password; - user = await UserService.LoginUserAsync(user, false, false); - isvalid = user.IsAuthenticated; + if (aliases.Exists(item => item.Name == name)) + { + unique = false; + } } - - if (isvalid) + if (unique) { - ShowProgressIndicator(); - - List aliases = new List(); - urls = urls.Replace("\n", ","); - foreach (string name in urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) - { - Alias alias = new Alias(); - alias.Name = name; - alias.TenantId = int.Parse(tenantid); - alias.SiteId = -1; - alias = await AliasService.AddAliasAsync(alias); - aliases.Add(alias); - } - - Site site = new Site(); - site.TenantId = int.Parse(tenantid); - site.Name = name; - site.LogoFileId = null; - site.DefaultThemeType = themetype; - site.DefaultLayoutType = (layouttype == null ? "" : layouttype); - site.DefaultContainerType = containertype; - site = await SiteService.AddSiteAsync(site, aliases[0]); - - foreach(Alias alias in aliases) - { - alias.SiteId = site.SiteId; - await AliasService.UpdateAliasAsync(alias); - } + bool isvalid = true; if (!isinitialized) { User user = new User(); - user.SiteId = site.SiteId; + user.SiteId = PageState.Site.SiteId; user.Username = username; user.Password = password; - user.Email = PageState.User.Email; - user.DisplayName = PageState.User.DisplayName; - user = await UserService.AddUserAsync(user, aliases[0]); - - if (user != null) - { - Tenant tenant = tenants.Where(item => item.TenantId == int.Parse(tenantid)).FirstOrDefault(); - tenant.IsInitialized = true; - await TenantService.UpdateTenantAsync(tenant); - } + user = await UserService.LoginUserAsync(user, false, false); + isvalid = user.IsAuthenticated; } - await logger.LogInformation("Site Created {Site}", site); - Uri uri = new Uri(NavigationManager.Uri); - NavigationManager.NavigateTo(uri.Scheme + "://" + aliases[0].Name, true); + if (isvalid) + { + ShowProgressIndicator(); + + aliases = new List(); + urls = urls.Replace("\n", ","); + foreach (string name in urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) + { + Alias alias = new Alias(); + alias.Name = name; + alias.TenantId = int.Parse(tenantid); + alias.SiteId = -1; + alias = await AliasService.AddAliasAsync(alias); + aliases.Add(alias); + } + + Site site = new Site(); + site.TenantId = int.Parse(tenantid); + site.Name = name; + site.LogoFileId = null; + site.DefaultThemeType = themetype; + site.DefaultLayoutType = (layouttype == null ? "" : layouttype); + site.DefaultContainerType = containertype; + site = await SiteService.AddSiteAsync(site, aliases[0]); + + foreach (Alias alias in aliases) + { + alias.SiteId = site.SiteId; + await AliasService.UpdateAliasAsync(alias); + } + + if (!isinitialized) + { + User user = new User(); + user.SiteId = site.SiteId; + user.Username = username; + user.Password = password; + user.Email = PageState.User.Email; + user.DisplayName = PageState.User.DisplayName; + user = await UserService.AddUserAsync(user, aliases[0]); + + if (user != null) + { + Tenant tenant = tenants.Where(item => item.TenantId == int.Parse(tenantid)).FirstOrDefault(); + tenant.IsInitialized = true; + await TenantService.UpdateTenantAsync(tenant); + } + } + await Log(aliases[0], LogLevel.Information, "", null, "Site Created {Site}", site); + + Uri uri = new Uri(NavigationManager.Uri); + NavigationManager.NavigateTo(uri.Scheme + "://" + aliases[0].Name, true); + } + else + { + await logger.LogError("Invalid Password Entered For Host {Username}", username); + AddModuleMessage("Invalid Host Password", MessageType.Error); + } } else { - await logger.LogError("Invalid Password Entered For Host {Username}", username); - AddModuleMessage("Invalid Host Password", MessageType.Error); + AddModuleMessage("An Alias Specified Has Already Been Used For Another Site", MessageType.Warning); } } else diff --git a/Oqtane.Client/Modules/Admin/Sites/Edit.razor b/Oqtane.Client/Modules/Admin/Sites/Edit.razor new file mode 100644 index 00000000..70f5cac0 --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Sites/Edit.razor @@ -0,0 +1,265 @@ +@namespace Oqtane.Modules.Admin.Sites +@inherits ModuleBase +@inject NavigationManager NavigationManager +@inject ISiteService SiteService +@inject ITenantService TenantService +@inject IAliasService AliasService +@inject IThemeService ThemeService + +@if (themes != null) +{ + + + + Name: + + + + + + + + Tenant: + + + + + + + + Aliases: + + + + + + + + Default Theme: + + + ThemeChanged(e))"> + <Select Theme> + @foreach (KeyValuePair item in themes) + { + if (item.Key == themetype) + { + @item.Value + } + else + { + @item.Value + } + } + + + + + + Default Layout: + + + + <Select Layout> + @foreach (KeyValuePair panelayout in panelayouts) + { + @panelayout.Value + } + + + + + + Default Container: + + + + <Select Container> + @foreach (KeyValuePair container in containers) + { + @container.Value + } + + + + + + Is Deleted? + + + + Yes + No + + + + + + Save + Cancel + + + +} + +@code { + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Host; } } + + Dictionary themes; + Dictionary panelayouts; + Dictionary containers; + + Alias Alias; + List Themes; + string name = ""; + List tenants; + string tenant = ""; + List aliases; + string urls = ""; + string themetype; + string layouttype; + string containertype; + + string createdby; + DateTime createdon; + string modifiedby; + DateTime modifiedon; + string deletedby; + DateTime? deletedon; + string isdeleted; + + protected override async Task OnInitializedAsync() + { + try + { + Themes = await ThemeService.GetThemesAsync(); + aliases = await AliasService.GetAliasesAsync(); + + Alias = aliases.Find(item => item.AliasId == Int32.Parse(PageState.QueryString["id"])); + Site site = await SiteService.GetSiteAsync(Alias.SiteId, Alias); + if (site != null) + { + name = site.Name; + tenants = await TenantService.GetTenantsAsync(); + tenant = tenants.Find(item => item.TenantId == site.TenantId).Name; + foreach (Alias alias in aliases.Where(item => item.SiteId == site.SiteId && item.TenantId == site.TenantId).ToList()) + { + urls += alias.Name + "\n"; + } + themetype = site.DefaultThemeType; + panelayouts = ThemeService.GetPaneLayoutTypes(Themes, themetype); + layouttype = site.DefaultLayoutType; + containertype = site.DefaultContainerType; + + createdby = site.CreatedBy; + createdon = site.CreatedOn; + modifiedby = site.ModifiedBy; + modifiedon = site.ModifiedOn; + deletedby = site.DeletedBy; + deletedon = site.DeletedOn; + isdeleted = site.IsDeleted.ToString(); + } + + themes = ThemeService.GetThemeTypes(Themes); + containers = ThemeService.GetContainerTypes(Themes); + } + catch (Exception ex) + { + await Log(Alias, LogLevel.Error, "", ex, "Error Loading Site {SiteId} {Error}", Alias.SiteId, ex.Message); + AddModuleMessage(ex.Message, MessageType.Error); + } + } + + private async void ThemeChanged(ChangeEventArgs e) + { + try + { + themetype = (string)e.Value; + if (themetype != "") + { + panelayouts = ThemeService.GetPaneLayoutTypes(Themes, themetype); + } + else + { + panelayouts = new Dictionary(); + } + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading Pane Layouts For Theme {ThemeType} {Error}", themetype, ex.Message); + AddModuleMessage("Error Loading Pane Layouts For Theme", MessageType.Error); + } + } + + private async Task SaveSite() + { + try + { + if (name != "" && urls != "" && !string.IsNullOrEmpty(themetype) && (panelayouts.Count == 0 || !string.IsNullOrEmpty(layouttype)) && !string.IsNullOrEmpty(containertype)) + { + bool unique = true; + foreach (string name in urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) + { + if (aliases.Exists(item => item.Name == name && item.SiteId != Alias.SiteId && item.TenantId != Alias.TenantId)) + { + unique = false; + } + } + if (unique) + { + Site site = await SiteService.GetSiteAsync(Alias.SiteId, Alias); + if (site != null) + { + site.Name = name; + site.LogoFileId = null; + site.DefaultThemeType = themetype; + site.DefaultLayoutType = (layouttype == null ? "" : layouttype); + site.DefaultContainerType = containertype; + site.IsDeleted = (isdeleted == null ? true : Boolean.Parse(isdeleted)); + + site = await SiteService.UpdateSiteAsync(site, Alias); + + urls = urls.Replace("\n", ","); + string[] names = urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + foreach (Alias alias in aliases.Where(item => item.SiteId == site.SiteId && item.TenantId == site.TenantId).ToList()) + { + if (!names.Contains(alias.Name)) + { + await AliasService.DeleteAliasAsync(alias.AliasId); + } + } + foreach (string name in names) + { + if (!aliases.Exists(item => item.Name == name)) + { + Alias alias = new Alias(); + alias.Name = name; + alias.TenantId = site.TenantId; + alias.SiteId = site.SiteId; + await AliasService.AddAliasAsync(alias); + } + } + + await Log(Alias, LogLevel.Information, "Edit", null, "Site Saved {Site}", site); + + NavigationManager.NavigateTo(NavigateUrl(Reload.Site)); + } + } + else + { + AddModuleMessage("An Alias Specified Has Already Been Used For Another Site", MessageType.Warning); + } + } + else + { + AddModuleMessage("You Must Provide A Site Name, Alias, And Default Theme/Container", MessageType.Warning); + } + } + catch (Exception ex) + { + await Log(Alias, LogLevel.Error, "", ex, "Error Saving Site {SiteId} {Error}", Alias.SiteId, ex.Message); + AddModuleMessage("Error Saving Site", MessageType.Error); + } + } + } diff --git a/Oqtane.Client/Modules/Admin/Sites/Index.razor b/Oqtane.Client/Modules/Admin/Sites/Index.razor index 5cf9bdbb..fa71d910 100644 --- a/Oqtane.Client/Modules/Admin/Sites/Index.razor +++ b/Oqtane.Client/Modules/Admin/Sites/Index.razor @@ -19,8 +19,8 @@ else Name - Edit - Delete + + @context.Name @@ -47,4 +47,31 @@ else } } } + + private async Task DeleteSite(Alias Alias) + { + try + { + if (Alias.SiteId != PageState.Site.SiteId || Alias.TenantId != PageState.Site.TenantId) + { + await SiteService.DeleteSiteAsync(Alias.SiteId, Alias); + await Log(Alias, LogLevel.Information, "", null, "Site Deleted {SiteId}", Alias.SiteId); + List aliases = await AliasService.GetAliasesAsync(); + foreach (Alias alias in aliases.Where(item => item.SiteId == Alias.SiteId && item.TenantId == Alias.TenantId).ToList()) + { + await AliasService.DeleteAliasAsync(alias.AliasId); + } + NavigationManager.NavigateTo(NavigateUrl(Reload.Site)); + } + else + { + AddModuleMessage("You Can Not Delete The Current Site", MessageType.Warning); + } + } + catch (Exception ex) + { + await Log(Alias, LogLevel.Error, "", ex, "Error Deleting Site {SiteId} {Error}", Alias.SiteId, ex.Message); + AddModuleMessage("Error Deleting Site", MessageType.Error); + } + } } \ No newline at end of file diff --git a/Oqtane.Client/Modules/Controls/ModuleMessage.razor b/Oqtane.Client/Modules/Controls/ModuleMessage.razor index a756e9dd..bdc96ba9 100644 --- a/Oqtane.Client/Modules/Controls/ModuleMessage.razor +++ b/Oqtane.Client/Modules/Controls/ModuleMessage.razor @@ -19,8 +19,11 @@ protected override void OnParametersSet() { - message = Message; - classname = GetMessageType(Type); + if (!string.IsNullOrEmpty(Message)) + { + message = Message; + classname = GetMessageType(Type); + } } public void SetModuleMessage(string message, MessageType type) diff --git a/Oqtane.Client/Modules/ModuleBase.cs b/Oqtane.Client/Modules/ModuleBase.cs index 778c9633..7f2e0872 100644 --- a/Oqtane.Client/Modules/ModuleBase.cs +++ b/Oqtane.Client/Modules/ModuleBase.cs @@ -130,7 +130,7 @@ namespace Oqtane.Modules } // logging methods - public async Task Log(LogLevel level, Exception exception, string message, params object[] args) + public async Task Log(Alias alias, LogLevel level, string function, Exception exception, string message, params object[] args) { int PageId = PageState.Page.PageId; int ModuleId = ModuleState.ModuleId; @@ -141,27 +141,31 @@ namespace Oqtane.Modules } string category = this.GetType().AssemblyQualifiedName; string feature = Utilities.GetTypeNameLastSegment(category, 1); - LogFunction function; - switch (PageState.Action) + LogFunction logfunction; + if (string.IsNullOrEmpty(function)) { - case "Add": - function = LogFunction.Create; + function = PageState.Action; + } + switch (function.ToLower()) + { + case "add": + logfunction = LogFunction.Create; break; - case "Edit": - function = LogFunction.Update; + case "edit": + logfunction = LogFunction.Update; break; - case "Delete": - function = LogFunction.Delete; + case "delete": + logfunction = LogFunction.Delete; break; default: - function = LogFunction.Read; + logfunction = LogFunction.Read; break; } if (feature == "Login") { - function = LogFunction.Security; + logfunction = LogFunction.Security; } - await LoggingService.Log(PageId, ModuleId, UserId, category, feature, function, level, exception, message, args); + await LoggingService.Log(alias, PageId, ModuleId, UserId, category, feature, logfunction, level, exception, message, args); } public class Logger @@ -175,62 +179,62 @@ namespace Oqtane.Modules public async Task LogTrace(string message, params object[] args) { - await modulebase.Log(LogLevel.Trace, null, message, args); + await modulebase.Log(null, LogLevel.Trace, "", null, message, args); } public async Task LogTrace(Exception exception, string message, params object[] args) { - await modulebase.Log(LogLevel.Trace, exception, message, args); + await modulebase.Log(null, LogLevel.Trace, "", exception, message, args); } public async Task LogDebug(string message, params object[] args) { - await modulebase.Log(LogLevel.Debug, null, message, args); + await modulebase.Log(null, LogLevel.Debug, "", null, message, args); } public async Task LogDebug(Exception exception, string message, params object[] args) { - await modulebase.Log(LogLevel.Debug, exception, message, args); + await modulebase.Log(null, LogLevel.Debug, "", exception, message, args); } public async Task LogInformation(string message, params object[] args) { - await modulebase.Log(LogLevel.Information, null, message, args); + await modulebase.Log(null, LogLevel.Information, "", null, message, args); } public async Task LogInformation(Exception exception, string message, params object[] args) { - await modulebase.Log(LogLevel.Information, exception, message, args); + await modulebase.Log(null, LogLevel.Information, "", exception, message, args); } public async Task LogWarning(string message, params object[] args) { - await modulebase.Log(LogLevel.Warning, null, message, args); + await modulebase.Log(null, LogLevel.Warning, "", null, message, args); } public async Task LogWarning(Exception exception, string message, params object[] args) { - await modulebase.Log(LogLevel.Warning, exception, message, args); + await modulebase.Log(null, LogLevel.Warning, "", exception, message, args); } public async Task LogError(string message, params object[] args) { - await modulebase.Log(LogLevel.Error, null, message, args); + await modulebase.Log(null, LogLevel.Error, "", null, message, args); } public async Task LogError(Exception exception, string message, params object[] args) { - await modulebase.Log(LogLevel.Error, exception, message, args); + await modulebase.Log(null, LogLevel.Error, "", exception, message, args); } public async Task LogCritical(string message, params object[] args) { - await modulebase.Log(LogLevel.Critical, null, message, args); + await modulebase.Log(null, LogLevel.Critical, "", null, message, args); } public async Task LogCritical(Exception exception, string message, params object[] args) { - await modulebase.Log(LogLevel.Critical, exception, message, args); + await modulebase.Log(null, LogLevel.Critical, "", exception, message, args); } } } diff --git a/Oqtane.Client/Services/Interfaces/ILogService.cs b/Oqtane.Client/Services/Interfaces/ILogService.cs index 77e7a294..171309f6 100644 --- a/Oqtane.Client/Services/Interfaces/ILogService.cs +++ b/Oqtane.Client/Services/Interfaces/ILogService.cs @@ -11,5 +11,6 @@ namespace Oqtane.Services Task> GetLogsAsync(int SiteId, string Level, string Function, int Rows); Task GetLogAsync(int LogId); Task Log(int? PageId, int? ModuleId, int? UserId, string category, string feature, LogFunction function, LogLevel level, Exception exception, string message, params object[] args); + Task Log(Alias Alias, int? PageId, int? ModuleId, int? UserId, string category, string feature, LogFunction function, LogLevel level, Exception exception, string message, params object[] args); } } diff --git a/Oqtane.Client/Services/Interfaces/ISiteService.cs b/Oqtane.Client/Services/Interfaces/ISiteService.cs index 1e0637bf..f3ab0790 100644 --- a/Oqtane.Client/Services/Interfaces/ISiteService.cs +++ b/Oqtane.Client/Services/Interfaces/ISiteService.cs @@ -6,14 +6,14 @@ namespace Oqtane.Services { public interface ISiteService { - Task> GetSitesAsync(); + Task> GetSitesAsync(Alias Alias); - Task GetSiteAsync(int SiteId); + Task GetSiteAsync(int SiteId, Alias Alias); Task AddSiteAsync(Site Site, Alias Alias); - Task UpdateSiteAsync(Site Site); + Task UpdateSiteAsync(Site Site, Alias Alias); - Task DeleteSiteAsync(int SiteId); + Task DeleteSiteAsync(int SiteId, Alias Alias); } } diff --git a/Oqtane.Client/Services/LogService.cs b/Oqtane.Client/Services/LogService.cs index 1241d433..d578e8d5 100644 --- a/Oqtane.Client/Services/LogService.cs +++ b/Oqtane.Client/Services/LogService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Net; using System.Net.Http; using System.Text.Json; using System.Threading.Tasks; @@ -38,9 +39,21 @@ namespace Oqtane.Services } public async Task Log(int? PageId, int? ModuleId, int? UserId, string category, string feature, LogFunction function, LogLevel level, Exception exception, string message, params object[] args) + { + await Log(null, PageId, ModuleId, UserId, category, feature, function, level, exception, message, args); + } + + public async Task Log(Alias Alias, int? PageId, int? ModuleId, int? UserId, string category, string feature, LogFunction function, LogLevel level, Exception exception, string message, params object[] args) { Log log = new Log(); - log.SiteId = sitestate.Alias.SiteId; + if (Alias == null) + { + log.SiteId = sitestate.Alias.SiteId; + } + else + { + log.SiteId = Alias.SiteId; + } log.PageId = PageId; log.ModuleId = ModuleId; log.UserId = UserId; @@ -56,7 +69,14 @@ namespace Oqtane.Services log.Message = message; log.MessageTemplate = ""; log.Properties = JsonSerializer.Serialize(args); - await http.PostJsonAsync(apiurl, log); + if (Alias == null) + { + await http.PostJsonAsync(apiurl, log); + } + else + { + await http.PostJsonAsync(apiurl + "?alias=" + WebUtility.UrlEncode(Alias.Name), log); + } } } } diff --git a/Oqtane.Client/Services/SettingService.cs b/Oqtane.Client/Services/SettingService.cs index 06c6534c..e2b00c13 100644 --- a/Oqtane.Client/Services/SettingService.cs +++ b/Oqtane.Client/Services/SettingService.cs @@ -124,8 +124,11 @@ namespace Oqtane.Services } else { - setting.SettingValue = kvp.Value; - setting = await UpdateSettingAsync(setting); + if (setting.SettingValue != kvp.Value) + { + setting.SettingValue = kvp.Value; + setting = await UpdateSettingAsync(setting); + } } } } diff --git a/Oqtane.Client/Services/SiteService.cs b/Oqtane.Client/Services/SiteService.cs index 4b922c1f..27658dde 100644 --- a/Oqtane.Client/Services/SiteService.cs +++ b/Oqtane.Client/Services/SiteService.cs @@ -27,37 +27,40 @@ namespace Oqtane.Services get { return CreateApiUrl(sitestate.Alias, NavigationManager.Uri, "Site"); } } - public async Task> GetSitesAsync() + private string urlsuffix(Alias Alias) { - List sites = await http.GetJsonAsync>(apiurl); + string querystring = ""; + if (Alias != null) + { + querystring = "?alias=" + WebUtility.UrlEncode(Alias.Name); + } + return querystring; + } + + public async Task> GetSitesAsync(Alias Alias) + { + List sites = await http.GetJsonAsync>(apiurl + urlsuffix(Alias)); return sites.OrderBy(item => item.Name).ToList(); } - public async Task GetSiteAsync(int SiteId) + public async Task GetSiteAsync(int SiteId, Alias Alias) { - return await http.GetJsonAsync(apiurl + "/" + SiteId.ToString()); + return await http.GetJsonAsync(apiurl + "/" + SiteId.ToString() + urlsuffix(Alias)); } public async Task AddSiteAsync(Site Site, Alias Alias) { - if (Alias == null) - { - return await http.PostJsonAsync(apiurl, Site); - } - else - { - return await http.PostJsonAsync(apiurl + "?alias=" + WebUtility.UrlEncode(Alias.Name), Site); - } + return await http.PostJsonAsync(apiurl + urlsuffix(Alias), Site); } - public async Task UpdateSiteAsync(Site Site) + public async Task UpdateSiteAsync(Site Site, Alias Alias) { - return await http.PutJsonAsync(apiurl + "/" + Site.SiteId.ToString(), Site); + return await http.PutJsonAsync(apiurl + "/" + Site.SiteId.ToString() + urlsuffix(Alias), Site); } - public async Task DeleteSiteAsync(int SiteId) + public async Task DeleteSiteAsync(int SiteId, Alias Alias) { - await http.DeleteAsync(apiurl + "/" + SiteId.ToString()); + await http.DeleteAsync(apiurl + "/" + SiteId.ToString() + urlsuffix(Alias)); } } } diff --git a/Oqtane.Client/Shared/SiteRouter.razor b/Oqtane.Client/Shared/SiteRouter.razor index 9cbed5f8..8e4e3e96 100644 --- a/Oqtane.Client/Shared/SiteRouter.razor +++ b/Oqtane.Client/Shared/SiteRouter.razor @@ -120,7 +120,7 @@ } if (PageState == null || reload <= Reload.Site) { - site = await SiteService.GetSiteAsync(alias.SiteId); + site = await SiteService.GetSiteAsync(alias.SiteId, alias); } else { diff --git a/Oqtane.Server/Controllers/SiteController.cs b/Oqtane.Server/Controllers/SiteController.cs index 19a87c46..46c61eff 100644 --- a/Oqtane.Server/Controllers/SiteController.cs +++ b/Oqtane.Server/Controllers/SiteController.cs @@ -87,16 +87,8 @@ namespace Oqtane.Controllers [Authorize(Roles = Constants.HostRole)] public void Delete(int id) { - Site Site = Sites.GetSite(id); - if (Sites.GetSites().Count() > 1) - { - Sites.DeleteSite(id); - logger.Log(Site.SiteId, LogLevel.Information, this, LogFunction.Delete, "Site Deleted {SiteId}", id); - } - else - { - logger.Log(Site.SiteId, LogLevel.Warning, this, LogFunction.Delete, "Unable to delete the root site."); - } + Sites.DeleteSite(id); + logger.Log(id, LogLevel.Information, this, LogFunction.Delete, "Site Deleted {SiteId}", id); } } } diff --git a/Oqtane.Server/Repository/SiteRepository.cs b/Oqtane.Server/Repository/SiteRepository.cs index 7aebafe5..e7b5137f 100644 --- a/Oqtane.Server/Repository/SiteRepository.cs +++ b/Oqtane.Server/Repository/SiteRepository.cs @@ -152,12 +152,9 @@ namespace Oqtane.Repository public void DeleteSite(int siteId) { - if (db.Site.Count() > 1) - { - var site = db.Site.Find(siteId); - db.Site.Remove(site); - db.SaveChanges(); - } + var site = db.Site.Find(siteId); + db.Site.Remove(site); + db.SaveChanges(); } private void CreateSite(Site site)