From 753ab3bdd75f7c7db263e271be8bdccae7083878 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 30 Apr 2025 13:46:52 -0400 Subject: [PATCH] resolve issue with host setting overrides --- .../Infrastructure/Jobs/NotificationJob.cs | 2 +- .../Middleware/TenantMiddleware.cs | 2 +- .../Interfaces/ISettingRepository.cs | 2 ++ Oqtane.Server/Repository/SettingRepository.cs | 33 ++++++++++--------- Oqtane.Server/Services/SiteService.cs | 2 +- 5 files changed, 23 insertions(+), 18 deletions(-) diff --git a/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs b/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs index d65acb0a..bfee3066 100644 --- a/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs +++ b/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs @@ -40,7 +40,7 @@ namespace Oqtane.Infrastructure log += "Processing Notifications For Site: " + site.Name + "
"; // get site settings - List sitesettings = settingRepository.GetSettings(EntityNames.Site, site.SiteId).ToList(); + List sitesettings = settingRepository.GetSettings(EntityNames.Site, site.SiteId, EntityNames.Host, -1).ToList(); Dictionary settings = GetSettings(sitesettings); if (!site.IsDeleted && (!settings.ContainsKey("SMTPEnabled") || settings["SMTPEnabled"] == "True")) { diff --git a/Oqtane.Server/Infrastructure/Middleware/TenantMiddleware.cs b/Oqtane.Server/Infrastructure/Middleware/TenantMiddleware.cs index fe0210fd..13b74176 100644 --- a/Oqtane.Server/Infrastructure/Middleware/TenantMiddleware.cs +++ b/Oqtane.Server/Infrastructure/Middleware/TenantMiddleware.cs @@ -39,7 +39,7 @@ namespace Oqtane.Infrastructure var sitesettings = cache.GetOrCreate(Constants.HttpContextSiteSettingsKey + alias.SiteKey, entry => { var settingRepository = context.RequestServices.GetService(typeof(ISettingRepository)) as ISettingRepository; - return settingRepository.GetSettings(EntityNames.Site, alias.SiteId) + return settingRepository.GetSettings(EntityNames.Site, alias.SiteId, EntityNames.Host, -1) .ToDictionary(setting => setting.SettingName, setting => setting.SettingValue); }); context.Items.Add(Constants.HttpContextSiteSettingsKey, sitesettings); diff --git a/Oqtane.Server/Repository/Interfaces/ISettingRepository.cs b/Oqtane.Server/Repository/Interfaces/ISettingRepository.cs index febb7c5c..3708d4cd 100644 --- a/Oqtane.Server/Repository/Interfaces/ISettingRepository.cs +++ b/Oqtane.Server/Repository/Interfaces/ISettingRepository.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using Oqtane.Models; +using Oqtane.Shared; namespace Oqtane.Repository { @@ -7,6 +8,7 @@ namespace Oqtane.Repository { IEnumerable GetSettings(string entityName); IEnumerable GetSettings(string entityName, int entityId); + IEnumerable GetSettings(string entityName1, int entityId1, string entityName2, int entityId2); Setting AddSetting(Setting setting); Setting UpdateSetting(Setting setting); Setting GetSetting(string entityName, int settingId); diff --git a/Oqtane.Server/Repository/SettingRepository.cs b/Oqtane.Server/Repository/SettingRepository.cs index 4fc7c70e..fdf57a13 100644 --- a/Oqtane.Server/Repository/SettingRepository.cs +++ b/Oqtane.Server/Repository/SettingRepository.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; using System.Linq; -using System.Linq.Expressions; +using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using Oqtane.Infrastructure; @@ -39,24 +39,27 @@ namespace Oqtane.Repository public IEnumerable GetSettings(string entityName, int entityId) { - var settings = GetSettings(entityName).ToList(); - if (entityName == EntityNames.Site) + return GetSettings(entityName).Where(item => item.EntityId == entityId); + } + + public IEnumerable GetSettings(string entityName1, int entityId1, string entityName2, int entityId2) + { + // merge settings from entity2 into entity1 + var settings1 = GetSettings(entityName1, entityId1).ToList(); + foreach (var setting2 in GetSettings(entityName2, entityId2)) { - // site settings can be overridden by host settings - var hostsettings = GetSettings(EntityNames.Host); - foreach (var hostsetting in hostsettings) + var setting1 = settings1.FirstOrDefault(item => item.SettingName == setting2.SettingName); + if (setting1 == null) { - if (settings.Any(item => item.SettingName == hostsetting.SettingName)) - { - settings.First(item => item.SettingName == hostsetting.SettingName).SettingValue = hostsetting.SettingValue; - } - else - { - settings.Add(new Setting { SettingId = -1, EntityName = entityName, EntityId = entityId, SettingName = hostsetting.SettingName, SettingValue = hostsetting.SettingValue, IsPrivate = hostsetting.IsPrivate }); - } + settings1.Add(new Setting { EntityName = entityName1, EntityId = entityId1, SettingName = setting2.SettingName, SettingValue = setting2.SettingValue, IsPrivate = setting2.IsPrivate }); + } + else + { + setting1.SettingValue = setting2.SettingValue; + setting1.IsPrivate = setting2.IsPrivate; } } - return settings.Where(item => item.EntityId == entityId); + return settings1; } public Setting AddSetting(Setting setting) diff --git a/Oqtane.Server/Services/SiteService.cs b/Oqtane.Server/Services/SiteService.cs index 11c624c3..cc0991d8 100644 --- a/Oqtane.Server/Services/SiteService.cs +++ b/Oqtane.Server/Services/SiteService.cs @@ -111,7 +111,7 @@ namespace Oqtane.Services if (site != null && site.SiteId == alias.SiteId) { // site settings - site.Settings = _settings.GetSettings(EntityNames.Site, site.SiteId) + site.Settings = _settings.GetSettings(EntityNames.Site, site.SiteId, EntityNames.Host, -1) .ToDictionary(setting => setting.SettingName, setting => (setting.IsPrivate ? _private : "") + setting.SettingValue); // populate file extensions