From dbcb9731196c3c5e6a3012874afc315896304832 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Sat, 11 Apr 2020 14:02:42 -0400 Subject: [PATCH] fixes to emable module package installation from wwwroot/modules --- .../Infrastructure/InstallationManager.cs | 12 +----- Oqtane.Server/Program.cs | 6 +-- .../Repository/ModuleDefinitionRepository.cs | 39 +++++++++++++------ Oqtane.Server/Startup.cs | 12 +++++- 4 files changed, 41 insertions(+), 28 deletions(-) diff --git a/Oqtane.Server/Infrastructure/InstallationManager.cs b/Oqtane.Server/Infrastructure/InstallationManager.cs index e76016c3..3479861d 100644 --- a/Oqtane.Server/Infrastructure/InstallationManager.cs +++ b/Oqtane.Server/Infrastructure/InstallationManager.cs @@ -107,17 +107,9 @@ namespace Oqtane.Infrastructure } } - if (install) + if (install && restart) { - if (restart) - { - RestartApplication(); - } - else - { - _cache.Remove("moduledefinitions"); - _cache.Remove("jobs"); - } + RestartApplication(); } } diff --git a/Oqtane.Server/Program.cs b/Oqtane.Server/Program.cs index d36b9f9b..08d1fa06 100644 --- a/Oqtane.Server/Program.cs +++ b/Oqtane.Server/Program.cs @@ -1,7 +1,5 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; -// DO NOT REMOVE - needed for client-side Blazor -using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.AspNetCore; using Microsoft.Extensions.DependencyInjection; @@ -14,11 +12,9 @@ namespace Oqtane.Server public static void Main(string[] args) { var host = BuildWebHost(args); + // execute any database migrations for the framework or extensions using (var serviceScope = host.Services.GetRequiredService().CreateScope()) { - var installationManager = serviceScope.ServiceProvider.GetService(); - // install any modules or themes stored in nugget, then restart app to ensure all is loaded in order - installationManager.InstallPackages("Modules,Themes", true); var databaseManager = serviceScope.ServiceProvider.GetService(); databaseManager.StartupMigration(); } diff --git a/Oqtane.Server/Repository/ModuleDefinitionRepository.cs b/Oqtane.Server/Repository/ModuleDefinitionRepository.cs index a97992c4..8d711245 100644 --- a/Oqtane.Server/Repository/ModuleDefinitionRepository.cs +++ b/Oqtane.Server/Repository/ModuleDefinitionRepository.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using Microsoft.Extensions.Caching.Memory; +using Oqtane.Extensions; using Oqtane.Models; using Oqtane.Modules; using Oqtane.Shared; @@ -36,7 +37,7 @@ namespace Oqtane.Repository public void UpdateModuleDefinition(ModuleDefinition moduleDefinition) { _permissions.UpdatePermissions(moduleDefinition.SiteId, EntityNames.ModuleDefinition, moduleDefinition.ModuleDefinitionId, moduleDefinition.Permissions); - _cache.Remove("moduledefinitions"); + _cache.Remove("moduledefinitions:" + moduleDefinition.SiteId.ToString()); } public void DeleteModuleDefinition(int moduleDefinitionId, int siteId) @@ -45,27 +46,35 @@ namespace Oqtane.Repository _permissions.DeletePermissions(siteId, EntityNames.ModuleDefinition, moduleDefinitionId); _db.ModuleDefinition.Remove(moduleDefinition); _db.SaveChanges(); - _cache.Remove("moduledefinitions"); } public List LoadModuleDefinitions(int siteId) { - List moduleDefinitions; + // get module definitions for site + List moduleDefinitions = _cache.GetOrCreate("moduledefinitions:" + siteId.ToString(), entry => + { + entry.SlidingExpiration = TimeSpan.FromMinutes(30); + return LoadSiteModuleDefinitions(siteId); + }); + return moduleDefinitions; + } - // get run-time module definitions - moduleDefinitions = _cache.GetOrCreate("moduledefinitions", entry => + private List LoadSiteModuleDefinitions(int siteId) + { + // get module assemblies + List moduleDefinitions = _cache.GetOrCreate("moduledefinitions", entry => { entry.SlidingExpiration = TimeSpan.FromMinutes(30); return LoadModuleDefinitionsFromAssemblies(); }); - // get module defintion permissions for site + // get module definition permissions for site List permissions = _permissions.GetPermissions(siteId, EntityNames.ModuleDefinition).ToList(); // get module definitions in database List moduledefs = _db.ModuleDefinition.ToList(); - // sync run-time module definitions with database + // sync module assemblies with database foreach (ModuleDefinition moduledefinition in moduleDefinitions) { ModuleDefinition moduledef = moduledefs.Where(item => item.ModuleDefinitionName == moduledefinition.ModuleDefinitionName).FirstOrDefault(); @@ -88,8 +97,8 @@ namespace Oqtane.Repository { moduledefinition.Permissions = _permissions.EncodePermissions(permissions.Where(item => item.EntityId == moduledef.ModuleDefinitionId)); } - // remove module definition from list - moduledefs.Remove(moduledef); + // remove module definition from list as it is already synced + moduledefs.Remove(moduledef); } moduledefinition.ModuleDefinitionId = moduledef.ModuleDefinitionId; moduledefinition.SiteId = siteId; @@ -104,6 +113,7 @@ namespace Oqtane.Repository { _permissions.DeletePermissions(siteId, EntityNames.ModuleDefinition, moduledefinition.ModuleDefinitionId); _db.ModuleDefinition.Remove(moduledefinition); // delete + _db.SaveChanges(); } return moduleDefinitions; @@ -166,11 +176,18 @@ namespace Oqtane.Repository moduledefinition.AssemblyName = assembly.FullName.Split(",")[0]; if (moduledefinition.Categories == "Admin") { - moduledefinition.Permissions = "[{\"PermissionName\":\"Utilize\",\"Permissions\":\"" + Constants.AdminRole + "\"}]"; + moduledefinition.Permissions = new List + { + new Permission(PermissionNames.Utilize, Constants.AdminRole, true) + }.EncodePermissions(); } else { - moduledefinition.Permissions = "[{\"PermissionName\":\"Utilize\",\"Permissions\":\"" + Constants.AdminRole + ";" + Constants.RegisteredRole + "\"}]"; + moduledefinition.Permissions = new List + { + new Permission(PermissionNames.Utilize, Constants.AdminRole, true), + new Permission(PermissionNames.Utilize, Constants.RegisteredRole, true) + }.EncodePermissions(); } moduledefinitions.Add(moduledefinition); index = moduledefinitions.FindIndex(item => item.ModuleDefinitionName == qualifiedModuleType); diff --git a/Oqtane.Server/Startup.cs b/Oqtane.Server/Startup.cs index d7c6f559..f2ed34bb 100644 --- a/Oqtane.Server/Startup.cs +++ b/Oqtane.Server/Startup.cs @@ -153,7 +153,14 @@ namespace Oqtane services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - + + // install any modules or themes ( this needs to occur BEFORE the assemblies are loaded into the app domain ) + #pragma warning disable ASP0000 + ServiceProvider sp = services.BuildServiceProvider(); + #pragma warning restore ASP0000 + var InstallationManager = sp.GetRequiredService(); + InstallationManager.InstallPackages("Modules,Themes", false); + // register transient scoped core services services.AddTransient(); services.AddTransient(); @@ -181,12 +188,13 @@ namespace Oqtane services.AddTransient(); services.AddTransient(); + // load the external assemblies into the app domain services.AddOqtaneModules(); services.AddOqtaneThemes(); services.AddOqtaneSiteTemplates(); services.AddMvc() - .AddOqtaneApplicationParts() + .AddOqtaneApplicationParts() // register any Controllers from custom modules .AddNewtonsoftJson(); services.AddOqtaneServices();