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");
}
}
}