From 4e53dcd8d59f2dc709fae18336c3d53eb369674a Mon Sep 17 00:00:00 2001 From: sbwalker Date: Mon, 15 Sep 2025 07:59:46 -0400 Subject: [PATCH] improve performance of UpdateSettingsAsync method --- Oqtane.Client/Services/SettingService.cs | 49 ++++------------ .../Controllers/SettingController.cs | 57 ++++++++++++++++++- 2 files changed, 66 insertions(+), 40 deletions(-) diff --git a/Oqtane.Client/Services/SettingService.cs b/Oqtane.Client/Services/SettingService.cs index 5bcbf414..c16442af 100644 --- a/Oqtane.Client/Services/SettingService.cs +++ b/Oqtane.Client/Services/SettingService.cs @@ -429,49 +429,20 @@ namespace Oqtane.Services public async Task UpdateSettingsAsync(Dictionary settings, string entityName, int entityId) { - var settingsList = await GetSettingsAsync(entityName, entityId, ""); + var settingsList = new List(); foreach (KeyValuePair kvp in settings) { - string value = kvp.Value; - bool modified = false; - bool isprivate = false; - - // manage settings modified with SetSetting method - if (value.StartsWith("[Private]")) - { - modified = true; - isprivate = true; - value = value.Substring(9); - } - if (value.StartsWith("[Public]")) - { - modified = true; - isprivate = false; - value = value.Substring(8); - } - - Setting setting = settingsList.FirstOrDefault(item => item.SettingName.Equals(kvp.Key, StringComparison.OrdinalIgnoreCase)); - if (setting == null) - { - setting = new Setting(); - setting.EntityName = entityName; - setting.EntityId = entityId; - setting.SettingName = kvp.Key; - setting.SettingValue = value; - setting.IsPrivate = isprivate; - setting = await AddSettingAsync(setting); - } - else - { - if (setting.SettingValue != value || (modified && setting.IsPrivate != isprivate)) - { - setting.SettingValue = value; - setting.IsPrivate = isprivate; - setting = await UpdateSettingAsync(setting); - } - } + var setting = new Setting(); + setting.EntityName = entityName; + setting.EntityId = entityId; + setting.SettingName = kvp.Key; + setting.SettingValue = kvp.Value; + setting.IsPrivate = true; + settingsList.Add(setting); } + + await PutJsonAsync>($"{Apiurl}/{entityName}/{entityId}", settingsList); } public async Task AddOrUpdateSettingAsync(string entityName, int entityId, string settingName, string settingValue, bool isPrivate) diff --git a/Oqtane.Server/Controllers/SettingController.cs b/Oqtane.Server/Controllers/SettingController.cs index ee777360..207b8a80 100644 --- a/Oqtane.Server/Controllers/SettingController.cs +++ b/Oqtane.Server/Controllers/SettingController.cs @@ -17,6 +17,8 @@ using Microsoft.Extensions.Options; using System.IO; using System.Text.RegularExpressions; using Oqtane.Migrations.Tenant; +using Google.Protobuf.WellKnownTypes; +using System; namespace Oqtane.Controllers { @@ -204,7 +206,60 @@ namespace Oqtane.Controllers } else { - _logger.Log(LogLevel.Error, this, LogFunction.Update, "User Not Authorized To Add Or Update Setting For EntityName {EntityName} EntityId {EntityId} SettingName {SettingName}", entityName, entityId, settingName); + _logger.Log(LogLevel.Error, this, LogFunction.Update, "User Not Authorized To Add Or Update Setting For {EntityName}:{EntityId}", entityName, entityId); + HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden; + } + } + + // PUT api//site/1 + [HttpPut("{entityName}/{entityId}")] + public void Put(string entityName, int entityId, [FromBody] List settings) + { + if (ModelState.IsValid && IsAuthorized(entityName,entityId, PermissionNames.Edit)) + { + 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]")) + { + 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); + + } + else + { + if (existingSetting.SettingValue != setting.SettingValue || (modified && existingSetting.IsPrivate != setting.IsPrivate)) + { + 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); + } + } + } + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Update, "User Not Authorized To Update Settings For {EntityName}:{EntityId}", entityName, entityId); HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden; } }