diff --git a/Oqtane.Client/Services/Interfaces/ISettingService.cs b/Oqtane.Client/Services/Interfaces/ISettingService.cs index 949db56d..dcdc7386 100644 --- a/Oqtane.Client/Services/Interfaces/ISettingService.cs +++ b/Oqtane.Client/Services/Interfaces/ISettingService.cs @@ -179,6 +179,17 @@ namespace Oqtane.Services /// Task UpdateSettingsAsync(Dictionary settings, string entityName, int entityId); + /// + /// Updates setting for a given entityName and Id + /// + /// + /// + /// + /// + /// + /// + Task AddOrUpdateSettingAsync(string entityName, int entityId, string settingName, string settingValue, bool isPrivate); + /// /// Returns a specific setting /// diff --git a/Oqtane.Client/Services/SettingService.cs b/Oqtane.Client/Services/SettingService.cs index a138bbb9..5176da7a 100644 --- a/Oqtane.Client/Services/SettingService.cs +++ b/Oqtane.Client/Services/SettingService.cs @@ -12,7 +12,7 @@ namespace Oqtane.Services [PrivateApi("Don't show in the documentation, as everything should use the Interface")] public class SettingService : ServiceBase, ISettingService { - public SettingService(HttpClient http, SiteState siteState) : base(http, siteState) { } + public SettingService(HttpClient http, SiteState siteState) : base(http, siteState) {} private string Apiurl => CreateApiUrl("Setting"); @@ -134,7 +134,7 @@ namespace Oqtane.Services public async Task> GetSettingsAsync(string entityName, int entityId) { var dictionary = new Dictionary(); - var settings = await GetJsonAsync>($"{Apiurl}?entityname={entityName}&entityid={entityId}"); + var settings = await GetSettingsAsync(entityName, entityId, ""); if (settings != null) { foreach (Setting setting in settings.OrderBy(item => item.SettingName).ToList()) @@ -147,7 +147,7 @@ namespace Oqtane.Services public async Task UpdateSettingsAsync(Dictionary settings, string entityName, int entityId) { - var settingsList = await GetJsonAsync>($"{Apiurl}?entityname={entityName}&entityid={entityId}"); + var settingsList = await GetSettingsAsync(entityName, entityId, ""); foreach (KeyValuePair kvp in settings) { @@ -192,14 +192,14 @@ namespace Oqtane.Services } } + public async Task AddOrUpdateSettingAsync(string entityName, int entityId, string settingName, string settingValue, bool isPrivate) + { + await PutJsonAsync($"{Apiurl}/{entityName}/{entityId}/{settingName}/{settingValue}/{isPrivate}", null); + } + public async Task DeleteSettingAsync(string entityName, int entityId, string settingName) { - var settings = await GetJsonAsync>($"{Apiurl}?entityname={entityName}&entityid={entityId}"); - var setting = settings.FirstOrDefault(item => item.SettingName == settingName); - if (setting != null) - { - await DeleteAsync($"{Apiurl}/{setting.SettingId}/{entityName}"); - } + await DeleteAsync($"{Apiurl}/{entityName}/{entityId}/{settingName}"); } public async Task> GetSettingsAsync(string entityName, int entityId, string settingName) diff --git a/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor b/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor index 83087013..9c195681 100644 --- a/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor +++ b/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor @@ -134,8 +134,7 @@ if (PageState.User != null) { // preserve edit mode for authenticated users - var userSettings = new Dictionary { { "CP-editmode", (PageState.EditMode) ? PageState.Page.PageId.ToString() : "-1" } }; - await SettingService.UpdateUserSettingsAsync(userSettings, PageState.User.UserId); + await SettingService.AddOrUpdateSettingAsync(EntityNames.User, PageState.User.UserId, "CP-editmode", (PageState.EditMode) ? PageState.Page.PageId.ToString() : "-1", false); } // preserve other querystring parameters diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index ca7dfe40..7c4cde03 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -270,9 +270,8 @@ { if (editpageid != -1) { - // reset edit page - var userSettings = new Dictionary { { "CP-editmode", "-1" } }; - await SettingService.UpdateUserSettingsAsync(userSettings, user.UserId); + // reset edit mode page + await SettingService.AddOrUpdateSettingAsync(EntityNames.User, user.UserId, "CP-editmode", "-1", false); } } } diff --git a/Oqtane.Server/Controllers/SettingController.cs b/Oqtane.Server/Controllers/SettingController.cs index 8dd1b7c3..30a01330 100644 --- a/Oqtane.Server/Controllers/SettingController.cs +++ b/Oqtane.Server/Controllers/SettingController.cs @@ -146,14 +146,52 @@ namespace Oqtane.Controllers return setting; } - // DELETE api//5/xxx - [HttpDelete("{id}/{entityName}")] - public void Delete(string entityName, int id) + // PUT api//site/1/settingname/x/false + [HttpPut("{entityName}/{entityId}/{settingName}/{settingValue}/{isPrivate}")] + public void Put(string entityName, int entityId, string settingName, string settingValue, bool isPrivate) { - Setting setting = _settings.GetSetting(entityName, id); + if (IsAuthorized(entityName, entityId, PermissionNames.Edit)) + { + Setting setting = _settings.GetSetting(entityName, entityId, settingName); + if (setting == null) + { + setting = new Setting(); + setting.EntityName = entityName; + setting.EntityId = entityId; + setting.SettingName = settingName; + setting.SettingValue = settingValue; + setting.IsPrivate = isPrivate; + setting = _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 (setting.SettingValue != settingValue || setting.IsPrivate != isPrivate) + { + setting.SettingValue = settingValue; + setting.IsPrivate = isPrivate; + setting = _settings.UpdateSetting(setting); + 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 Add Or Update Setting {EntityName} {EntityId} {SettingName}", entityName, entityId, settingName); + HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden; + } + } + + // DELETE api//site/1/settingname + [HttpDelete("{entityName}/{entityId}/{settingName}")] + public void Delete(string entityName, int entityId, string settingName) + { + Setting setting = _settings.GetSetting(entityName, entityId, settingName); if (IsAuthorized(setting.EntityName, setting.EntityId, PermissionNames.Edit)) { - _settings.DeleteSetting(setting.EntityName, id); + _settings.DeleteSetting(setting.EntityName, setting.SettingId); AddSyncEvent(setting.EntityName, setting.EntityId, setting.SettingId, SyncEventActions.Delete); _logger.Log(LogLevel.Information, this, LogFunction.Delete, "Setting Deleted {Setting}", setting); }