From 2be11b52c32f70d1336c0ad5ca4c9851a9b5e69d Mon Sep 17 00:00:00 2001 From: sbwalker Date: Sun, 19 Oct 2025 13:34:21 -0400 Subject: [PATCH] fix #5708 - resolve issue saving settings --- Oqtane.Client/Services/SettingService.cs | 17 +++++++- .../Controllers/SettingController.cs | 41 ++++++------------- 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/Oqtane.Client/Services/SettingService.cs b/Oqtane.Client/Services/SettingService.cs index c16442af..469ab171 100644 --- a/Oqtane.Client/Services/SettingService.cs +++ b/Oqtane.Client/Services/SettingService.cs @@ -434,11 +434,26 @@ namespace Oqtane.Services foreach (KeyValuePair kvp in settings) { var setting = new Setting(); + setting.SettingId = 0; setting.EntityName = entityName; setting.EntityId = entityId; setting.SettingName = kvp.Key; setting.SettingValue = kvp.Value; - setting.IsPrivate = true; + + // manage settings modified with SetSetting method + if (setting.SettingValue.StartsWith("[Private]")) + { + setting.SettingValue = setting.SettingValue.Substring(9); + setting.IsPrivate = true; + setting.SettingId = -1; // indicates IsPrivate was explicitly set + } + if (setting.SettingValue.StartsWith("[Public]")) + { + setting.SettingValue = setting.SettingValue.Substring(8); + setting.IsPrivate = false; + setting.SettingId = -1; // indicates IsPrivate was explicitly set + } + settingsList.Add(setting); } diff --git a/Oqtane.Server/Controllers/SettingController.cs b/Oqtane.Server/Controllers/SettingController.cs index 3c1db3d5..8f17ac62 100644 --- a/Oqtane.Server/Controllers/SettingController.cs +++ b/Oqtane.Server/Controllers/SettingController.cs @@ -16,8 +16,6 @@ using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.Extensions.Options; using System.IO; using System.Text.RegularExpressions; -using Oqtane.Migrations.Tenant; -using Google.Protobuf.WellKnownTypes; using System; namespace Oqtane.Controllers @@ -220,39 +218,24 @@ namespace Oqtane.Controllers var existingSettings = _settings.GetSettings(entityName, entityId).ToList(); foreach (Setting setting in settings) { - bool modified = false; - - // manage settings modified with SetSetting method - if (setting.SettingValue.StartsWith("[Private]")) + Setting existing = existingSettings.FirstOrDefault(item => item.SettingName.Equals(setting.SettingName, StringComparison.OrdinalIgnoreCase)); + if (existing == null) { - modified = true; - setting.IsPrivate = true; - setting.SettingValue = setting.SettingValue.Substring(9); - } - if (setting.SettingValue.StartsWith("[Public]")) - { - modified = true; - setting.IsPrivate = false; - setting.SettingValue = setting.SettingValue.Substring(8); - } - - Setting existingSetting = existingSettings.FirstOrDefault(item => item.SettingName.Equals(setting.SettingName, StringComparison.OrdinalIgnoreCase)); - if (existingSetting == null) - { - _settings.AddSetting(setting); - AddSyncEvent(setting.EntityName, setting.EntityId, setting.SettingId, SyncEventActions.Create); - _logger.Log(LogLevel.Information, this, LogFunction.Update, "Setting Created {Setting}", setting); + existing = _settings.AddSetting(setting); + AddSyncEvent(existing.EntityName, existing.EntityId, existing.SettingId, SyncEventActions.Create); + _logger.Log(LogLevel.Information, this, LogFunction.Update, "Setting Created {Setting}", existing); } else { - if (existingSetting.SettingValue != setting.SettingValue || (modified && existingSetting.IsPrivate != setting.IsPrivate)) + // note that SettingId will pnly be 0 if the Settings were converted from a Dictionary in the SettingService + if (existing.SettingValue != setting.SettingValue || (existing.IsPrivate != setting.IsPrivate && setting.SettingId != 0)) { - existingSetting.SettingValue = setting.SettingValue; - existingSetting.IsPrivate = setting.IsPrivate; - _settings.UpdateSetting(existingSetting); - AddSyncEvent(setting.EntityName, setting.EntityId, setting.SettingId, SyncEventActions.Update); - _logger.Log(LogLevel.Information, this, LogFunction.Update, "Setting Updated {Setting}", setting); + existing.SettingValue = setting.SettingValue; + existing.IsPrivate = setting.IsPrivate; + existing = _settings.UpdateSetting(existing); + AddSyncEvent(existing.EntityName, existing.EntityId, existing.SettingId, SyncEventActions.Update); + _logger.Log(LogLevel.Information, this, LogFunction.Update, "Setting Updated {Setting}", existing); } } }