optimize client assembly download service, add support for site level scripts
This commit is contained in:
@ -11,6 +11,7 @@ namespace Oqtane.Repository
|
||||
Site GetSite(int siteId);
|
||||
Site GetSite(int siteId, bool tracking);
|
||||
void DeleteSite(int siteId);
|
||||
void InitializeSite(int siteId);
|
||||
void CreatePages(Site site, List<PageTemplate> pageTemplates);
|
||||
}
|
||||
}
|
||||
|
@ -4,12 +4,14 @@ using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Xml;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Caching.Memory;
|
||||
using Oqtane.Infrastructure;
|
||||
using Oqtane.Models;
|
||||
using Oqtane.Modules;
|
||||
using Oqtane.Shared;
|
||||
using Oqtane.Themes;
|
||||
|
||||
namespace Oqtane.Repository
|
||||
{
|
||||
@ -20,15 +22,17 @@ namespace Oqtane.Repository
|
||||
private readonly IPermissionRepository _permissions;
|
||||
private readonly ITenantManager _tenants;
|
||||
private readonly ISettingRepository _settings;
|
||||
private readonly ServerStateManager _serverState;
|
||||
private readonly string settingprefix = "SiteEnabled:";
|
||||
|
||||
public ModuleDefinitionRepository(MasterDBContext context, IMemoryCache cache, IPermissionRepository permissions, ITenantManager tenants, ISettingRepository settings)
|
||||
public ModuleDefinitionRepository(MasterDBContext context, IMemoryCache cache, IPermissionRepository permissions, ITenantManager tenants, ISettingRepository settings, ServerStateManager serverState)
|
||||
{
|
||||
_db = context;
|
||||
_cache = cache;
|
||||
_permissions = permissions;
|
||||
_tenants = tenants;
|
||||
_settings = settings;
|
||||
_serverState = serverState;
|
||||
}
|
||||
|
||||
public IEnumerable<ModuleDefinition> GetModuleDefinitions()
|
||||
@ -182,6 +186,7 @@ namespace Oqtane.Repository
|
||||
var settings = _settings.GetSettings(EntityNames.ModuleDefinition).ToList();
|
||||
|
||||
// populate module definition site settings and permissions
|
||||
var serverState = _serverState.GetServerState(siteId);
|
||||
foreach (ModuleDefinition moduledefinition in ModuleDefinitions)
|
||||
{
|
||||
moduledefinition.SiteId = siteId;
|
||||
@ -196,6 +201,36 @@ namespace Oqtane.Repository
|
||||
moduledefinition.IsEnabled = moduledefinition.IsAutoEnabled;
|
||||
}
|
||||
|
||||
if (moduledefinition.IsEnabled)
|
||||
{
|
||||
// build list of assemblies for site
|
||||
if (!serverState.Assemblies.Contains(moduledefinition.AssemblyName))
|
||||
{
|
||||
serverState.Assemblies.Add(moduledefinition.AssemblyName);
|
||||
}
|
||||
if (!string.IsNullOrEmpty(moduledefinition.Dependencies))
|
||||
{
|
||||
foreach (var assembly in moduledefinition.Dependencies.Replace(".dll", "").Split(',', StringSplitOptions.RemoveEmptyEntries).Reverse())
|
||||
{
|
||||
if (!serverState.Assemblies.Contains(assembly))
|
||||
{
|
||||
serverState.Assemblies.Insert(0, assembly);
|
||||
}
|
||||
}
|
||||
}
|
||||
// build list of scripts for site
|
||||
if (moduledefinition.Resources != null)
|
||||
{
|
||||
foreach (var resource in moduledefinition.Resources.Where(item => item.Level == ResourceLevel.Site))
|
||||
{
|
||||
if (!serverState.Scripts.Contains(resource))
|
||||
{
|
||||
serverState.Scripts.Add(resource);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (permissions.Count == 0)
|
||||
{
|
||||
// no module definition permissions exist for this site
|
||||
@ -216,6 +251,7 @@ namespace Oqtane.Repository
|
||||
}
|
||||
}
|
||||
}
|
||||
_serverState.SetServerState(siteId, serverState);
|
||||
|
||||
// clean up any orphaned permissions
|
||||
var ids = new HashSet<int>(ModuleDefinitions.Select(item => item.ModuleDefinitionId));
|
||||
@ -295,6 +331,16 @@ namespace Oqtane.Repository
|
||||
moduledefinition.ModuleDefinitionName = qualifiedModuleType;
|
||||
moduledefinition.ControlTypeTemplate = modulecontroltype.Namespace + "." + Constants.ActionToken + ", " + modulecontroltype.Assembly.GetName().Name;
|
||||
moduledefinition.AssemblyName = assembly.GetName().Name;
|
||||
if (moduledefinition.Resources != null)
|
||||
{
|
||||
foreach (var resource in moduledefinition.Resources)
|
||||
{
|
||||
if (resource.Url.StartsWith("~"))
|
||||
{
|
||||
resource.Url = resource.Url.Replace("~", "/Modules/" + Utilities.GetTypeName(moduledefinition.ModuleDefinitionName) + "/").Replace("//", "/");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
moduledefinition.IsPortable = false;
|
||||
if (!string.IsNullOrEmpty(moduledefinition.ServerManagerType))
|
||||
|
@ -24,11 +24,12 @@ namespace Oqtane.Repository
|
||||
private readonly IModuleRepository _moduleRepository;
|
||||
private readonly IPageModuleRepository _pageModuleRepository;
|
||||
private readonly IModuleDefinitionRepository _moduleDefinitionRepository;
|
||||
private readonly IThemeRepository _themeRepository;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private readonly IConfigurationRoot _config;
|
||||
|
||||
public SiteRepository(TenantDBContext context, IRoleRepository roleRepository, IProfileRepository profileRepository, IFolderRepository folderRepository, IPageRepository pageRepository,
|
||||
IModuleRepository moduleRepository, IPageModuleRepository pageModuleRepository, IModuleDefinitionRepository moduleDefinitionRepository, IServiceProvider serviceProvider,
|
||||
IModuleRepository moduleRepository, IPageModuleRepository pageModuleRepository, IModuleDefinitionRepository moduleDefinitionRepository, IThemeRepository themeRepository, IServiceProvider serviceProvider,
|
||||
IConfigurationRoot config)
|
||||
{
|
||||
_db = context;
|
||||
@ -39,6 +40,7 @@ namespace Oqtane.Repository
|
||||
_moduleRepository = moduleRepository;
|
||||
_pageModuleRepository = pageModuleRepository;
|
||||
_moduleDefinitionRepository = moduleDefinitionRepository;
|
||||
_themeRepository = themeRepository;
|
||||
_serviceProvider = serviceProvider;
|
||||
_config = config;
|
||||
}
|
||||
@ -88,6 +90,12 @@ namespace Oqtane.Repository
|
||||
_db.SaveChanges();
|
||||
}
|
||||
|
||||
public void InitializeSite(int siteId)
|
||||
{
|
||||
_moduleDefinitionRepository.GetModuleDefinitions(siteId);
|
||||
_themeRepository.GetThemes();
|
||||
}
|
||||
|
||||
private void CreateSite(Site site)
|
||||
{
|
||||
// create default entities for site
|
||||
|
@ -21,14 +21,16 @@ namespace Oqtane.Repository
|
||||
private readonly IMemoryCache _cache;
|
||||
private readonly ITenantManager _tenants;
|
||||
private readonly ISettingRepository _settings;
|
||||
private readonly ServerStateManager _serverState;
|
||||
private readonly string settingprefix = "SiteEnabled:";
|
||||
|
||||
public ThemeRepository(MasterDBContext context, IMemoryCache cache, ITenantManager tenants, ISettingRepository settings)
|
||||
public ThemeRepository(MasterDBContext context, IMemoryCache cache, ITenantManager tenants, ISettingRepository settings, ServerStateManager serverState)
|
||||
{
|
||||
_db = context;
|
||||
_cache = cache;
|
||||
_tenants = tenants;
|
||||
_settings = settings;
|
||||
_serverState = serverState;
|
||||
}
|
||||
|
||||
public IEnumerable<Theme> GetThemes()
|
||||
@ -147,6 +149,7 @@ namespace Oqtane.Repository
|
||||
var settings = _settings.GetSettings(EntityNames.Theme).ToList();
|
||||
|
||||
// populate theme site settings
|
||||
var serverState = _serverState.GetServerState(siteId);
|
||||
foreach (Theme theme in Themes)
|
||||
{
|
||||
theme.SiteId = siteId;
|
||||
@ -160,7 +163,38 @@ namespace Oqtane.Repository
|
||||
{
|
||||
theme.IsEnabled = theme.IsAutoEnabled;
|
||||
}
|
||||
|
||||
if (theme.IsEnabled)
|
||||
{
|
||||
// build list of assemblies for site
|
||||
if (!serverState.Assemblies.Contains(theme.AssemblyName))
|
||||
{
|
||||
serverState.Assemblies.Add(theme.AssemblyName);
|
||||
}
|
||||
if (!string.IsNullOrEmpty(theme.Dependencies))
|
||||
{
|
||||
foreach (var assembly in theme.Dependencies.Replace(".dll", "").Split(',', StringSplitOptions.RemoveEmptyEntries).Reverse())
|
||||
{
|
||||
if (!serverState.Assemblies.Contains(assembly))
|
||||
{
|
||||
serverState.Assemblies.Insert(0, assembly);
|
||||
}
|
||||
}
|
||||
}
|
||||
// build list of scripts for site
|
||||
if (theme.Resources != null)
|
||||
{
|
||||
foreach (var resource in theme.Resources.Where(item => item.Level == ResourceLevel.Site))
|
||||
{
|
||||
if (!serverState.Scripts.Contains(resource))
|
||||
{
|
||||
serverState.Scripts.Add(resource);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
_serverState.SetServerState(siteId, serverState);
|
||||
}
|
||||
|
||||
return Themes;
|
||||
@ -225,12 +259,22 @@ namespace Oqtane.Repository
|
||||
Version = new Version(1, 0, 0).ToString()
|
||||
};
|
||||
}
|
||||
|
||||
// set internal properties
|
||||
theme.ThemeName = qualifiedThemeType;
|
||||
theme.Themes = new List<ThemeControl>();
|
||||
theme.Containers = new List<ThemeControl>();
|
||||
theme.AssemblyName = assembly.FullName.Split(",")[0];
|
||||
|
||||
if (theme.Resources != null)
|
||||
{
|
||||
foreach (var resource in theme.Resources)
|
||||
{
|
||||
if (resource.Url.StartsWith("~"))
|
||||
{
|
||||
resource.Url = resource.Url.Replace("~", "/Themes/" + Utilities.GetTypeName(theme.ThemeName) + "/").Replace("//", "/");
|
||||
}
|
||||
}
|
||||
}
|
||||
Debug.WriteLine($"Oqtane Info: Registering Theme {theme.ThemeName}");
|
||||
themes.Add(theme);
|
||||
index = themes.FindIndex(item => item.ThemeName == qualifiedThemeType);
|
||||
|
Reference in New Issue
Block a user