using System; using Oqtane.Models; using System.Threading.Tasks; using System.Net.Http; using System.Linq; using System.Collections.Generic; using Oqtane.Documentation; using Oqtane.Shared; namespace Oqtane.Services { /// /// Service to manage s /// public interface ISettingService { /// /// Returns a key-value dictionary of all tenant settings /// /// Task> GetTenantSettingsAsync(); /// /// Updates a tenant setting /// /// /// Task UpdateTenantSettingsAsync(Dictionary tenantSettings); /// /// Returns a key-value dictionary of all site settings for the given site /// /// /// Task> GetSiteSettingsAsync(int siteId); /// /// Updates a site setting /// /// /// /// Task UpdateSiteSettingsAsync(Dictionary siteSettings, int siteId); /// /// Clears site option cache /// /// Task ClearSiteSettingsCacheAsync(); /// /// Returns a key-value dictionary of all page settings for the given page /// /// /// Task> GetPageSettingsAsync(int pageId); /// /// Updates a page setting /// /// /// /// Task UpdatePageSettingsAsync(Dictionary pageSettings, int pageId); /// /// Returns a key-value dictionary of all page module settings for the given page module /// /// /// Task> GetPageModuleSettingsAsync(int pageModuleId); /// /// Updates a page module setting /// /// /// /// Task UpdatePageModuleSettingsAsync(Dictionary pageModuleSettings, int pageModuleId); /// /// Returns a key-value dictionary of all module settings for the given module /// /// /// Task> GetModuleSettingsAsync(int moduleId); /// /// Updates a module setting /// /// /// /// Task UpdateModuleSettingsAsync(Dictionary moduleSettings, int moduleId); /// /// Returns a key-value dictionary of all module settings for the given module /// /// /// Task> GetModuleDefinitionSettingsAsync(int moduleDefinitionId); /// /// Updates a module setting /// /// /// /// Task UpdateModuleDefinitionSettingsAsync(Dictionary moduleDefinitionSettings, int moduleDefinitionId); /// /// Returns a key-value dictionary of all user settings for the given user /// /// /// Task> GetUserSettingsAsync(int userId); /// /// Updates a user setting /// /// /// /// Task UpdateUserSettingsAsync(Dictionary userSettings, int userId); /// /// Returns a key-value dictionary of all folder settings for the given folder /// /// /// Task> GetFolderSettingsAsync(int folderId); /// /// Updates a folder setting /// /// /// /// Task UpdateFolderSettingsAsync(Dictionary folderSettings, int folderId); /// /// Returns a key-value dictionary of all tenant settings /// /// Task> GetHostSettingsAsync(); /// /// Updates a host setting /// /// /// Task UpdateHostSettingsAsync(Dictionary hostSettings); /// /// Returns a key-value dictionary of all settings for the given visitor /// /// /// Task> GetVisitorSettingsAsync(int visitorId); /// /// Updates a visitor setting /// /// /// /// Task UpdateVisitorSettingsAsync(Dictionary visitorSettings, int visitorId); /// /// Returns a key-value dictionary of all settings for the given entityName /// /// /// Task> GetSettingsAsync(string entityName, int entityId); /// /// Updates settings for a given entityName and Id /// /// /// /// /// 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 /// /// /// /// /// Task DeleteSettingAsync(string entityName, int entityId, string settingName); /// /// Returns a specific setting /// /// /// /// /// Task> GetSettingsAsync(string entityName, int entityId, string settingName); /// /// Returns a specific setting /// /// /// Task GetSettingAsync(string entityName, int settingId); /// /// Creates a new setting /// /// /// Task AddSettingAsync(Setting setting); /// /// Updates a existing setting /// /// /// Task UpdateSettingAsync(Setting setting); /// /// Deletes a setting /// /// /// Task DeleteSettingAsync(string entityName, int settingId); /// /// Gets the value of the given settingName (key) from the given key-value dictionary /// /// /// /// /// string GetSetting(Dictionary settings, string settingName, string defaultValue); /// /// Sets the value of the given settingName (key) in the given key-value dictionary /// /// /// /// /// Dictionary SetSetting(Dictionary settings, string settingName, string settingValue); Dictionary SetSetting(Dictionary settings, string settingName, string settingValue, bool isPrivate); Dictionary MergeSettings(Dictionary baseSettings, Dictionary overwriteSettings); [Obsolete("GetSettingAsync(int settingId) is deprecated. Use GetSettingAsync(string entityName, int settingId) instead.", false)] Task GetSettingAsync(int settingId); [Obsolete("DeleteSettingAsync(int settingId) is deprecated. Use DeleteSettingAsync(string entityName, int settingId) instead.", false)] Task DeleteSettingAsync(int settingId); } [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) {} private string Apiurl => CreateApiUrl("Setting"); public async Task> GetTenantSettingsAsync() { return await GetSettingsAsync(EntityNames.Tenant, -1); } public async Task UpdateTenantSettingsAsync(Dictionary tenantSettings) { await UpdateSettingsAsync(tenantSettings, EntityNames.Tenant, -1); } public async Task> GetSiteSettingsAsync(int siteId) { return await GetSettingsAsync(EntityNames.Site, siteId); } public async Task UpdateSiteSettingsAsync(Dictionary siteSettings, int siteId) { await UpdateSettingsAsync(siteSettings, EntityNames.Site, siteId); } public async Task ClearSiteSettingsCacheAsync() { await DeleteAsync($"{Apiurl}/clear"); } public async Task> GetPageSettingsAsync(int pageId) { return await GetSettingsAsync(EntityNames.Page, pageId); } public async Task UpdatePageSettingsAsync(Dictionary pageSettings, int pageId) { await UpdateSettingsAsync(pageSettings, EntityNames.Page, pageId); } public async Task> GetPageModuleSettingsAsync(int pageModuleId) { return await GetSettingsAsync(EntityNames.PageModule, pageModuleId); } public async Task UpdatePageModuleSettingsAsync(Dictionary pageModuleSettings, int pageModuleId) { await UpdateSettingsAsync(pageModuleSettings, EntityNames.PageModule, pageModuleId); } public async Task> GetModuleSettingsAsync(int moduleId) { return await GetSettingsAsync(EntityNames.Module, moduleId); } public async Task UpdateModuleSettingsAsync(Dictionary moduleSettings, int moduleId) { await UpdateSettingsAsync(moduleSettings, EntityNames.Module, moduleId); } public async Task> GetModuleDefinitionSettingsAsync(int moduleDefinitionId) { return await GetSettingsAsync(EntityNames.ModuleDefinition, moduleDefinitionId); } public async Task UpdateModuleDefinitionSettingsAsync(Dictionary moduleDefinitionSettings, int moduleDefinitionId) { await UpdateSettingsAsync(moduleDefinitionSettings, EntityNames.ModuleDefinition, moduleDefinitionId); } public async Task> GetUserSettingsAsync(int userId) { return await GetSettingsAsync(EntityNames.User, userId); } public async Task UpdateUserSettingsAsync(Dictionary userSettings, int userId) { await UpdateSettingsAsync(userSettings, EntityNames.User, userId); } public async Task> GetFolderSettingsAsync(int folderId) { return await GetSettingsAsync( EntityNames.Folder, folderId); } public async Task UpdateFolderSettingsAsync(Dictionary folderSettings, int folderId) { await UpdateSettingsAsync(folderSettings, EntityNames.Folder, folderId); } public async Task> GetHostSettingsAsync() { return await GetSettingsAsync(EntityNames.Host, -1); } public async Task UpdateHostSettingsAsync(Dictionary hostSettings) { await UpdateSettingsAsync(hostSettings, EntityNames.Host, -1); } public async Task> GetVisitorSettingsAsync(int visitorId) { if (visitorId != -1) { return await GetSettingsAsync(EntityNames.Visitor, visitorId); } else { return new Dictionary(); } } public async Task UpdateVisitorSettingsAsync(Dictionary visitorSettings, int visitorId) { if (visitorId != -1) { await UpdateSettingsAsync(visitorSettings, EntityNames.Visitor, visitorId); } } public async Task> GetSettingsAsync(string entityName, int entityId) { var dictionary = new Dictionary(); var settings = await GetSettingsAsync(entityName, entityId, ""); if (settings != null) { foreach (Setting setting in settings.OrderBy(item => item.SettingName).ToList()) { dictionary.Add(setting.SettingName, setting.SettingValue); } } return dictionary; } public async Task UpdateSettingsAsync(Dictionary settings, string entityName, int entityId) { var settingsList = await GetSettingsAsync(entityName, entityId, ""); 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); } } } } public async Task AddOrUpdateSettingAsync(string entityName, int entityId, string settingName, string settingValue, bool isPrivate) { await PutAsync($"{Apiurl}/{entityName}/{entityId}/{settingName}/{settingValue}/{isPrivate}"); } public async Task DeleteSettingAsync(string entityName, int entityId, string settingName) { await DeleteAsync($"{Apiurl}/{entityName}/{entityId}/{settingName}"); } public async Task> GetSettingsAsync(string entityName, int entityId, string settingName) { var settings = await GetJsonAsync>($"{Apiurl}?entityname={entityName}&entityid={entityId}"); if (!string.IsNullOrEmpty(settingName)) { settings = settings.Where(item => item.SettingName == settingName).ToList(); } return settings; } public async Task GetSettingAsync(string entityName, int settingId) { return await GetJsonAsync($"{Apiurl}/{settingId}/{entityName}"); } public async Task AddSettingAsync(Setting setting) { return await PostJsonAsync(Apiurl, setting); } public async Task UpdateSettingAsync(Setting setting) { return await PutJsonAsync($"{Apiurl}/{setting.SettingId}", setting); } public async Task DeleteSettingAsync(string entityName, int settingId) { await DeleteAsync($"{Apiurl}/{settingId}/{entityName}"); } public string GetSetting(Dictionary settings, string settingName, string defaultValue) { string value = defaultValue; if (settings != null && settings.ContainsKey(settingName)) { value = settings[settingName]; } return value; } public Dictionary SetSetting(Dictionary settings, string settingName, string settingValue) { return SetSetting(settings, settingName, settingValue, false); } public Dictionary SetSetting(Dictionary settings, string settingName, string settingValue, bool isPrivate) { if (settings == null) { settings = new Dictionary(); } settingValue = (isPrivate) ? "[Private]" + settingValue : "[Public]" + settingValue; if (settings.ContainsKey(settingName)) { settings[settingName] = settingValue; } else { settings.Add(settingName, settingValue); } return settings; } public Dictionary MergeSettings(Dictionary baseSettings, Dictionary overwriteSettings) { var settings = baseSettings != null ? new Dictionary(baseSettings) : new Dictionary(); if (overwriteSettings != null) { foreach (var setting in overwriteSettings) { if (settings.ContainsKey(setting.Key)) { settings[setting.Key] = setting.Value; } else { settings.Add(setting.Key, setting.Value); } } } return settings; } [Obsolete("GetSettingAsync(int settingId) is deprecated. Use GetSettingAsync(string entityName, int settingId) instead.", false)] public async Task GetSettingAsync(int settingId) { return await GetJsonAsync($"{Apiurl}/{settingId}/tenant"); } [Obsolete("DeleteSettingAsync(int settingId) is deprecated. Use DeleteSettingAsync(string entityName, int settingId) instead.", false)] public async Task DeleteSettingAsync(int settingId) { await DeleteAsync($"{Apiurl}/{settingId}/tenant"); } } }