fixes to emable module package installation from wwwroot/modules

This commit is contained in:
Shaun Walker 2020-04-11 14:02:42 -04:00
parent 93a09f6db8
commit dbcb973119
4 changed files with 41 additions and 28 deletions

View File

@ -107,17 +107,9 @@ namespace Oqtane.Infrastructure
} }
} }
if (install) if (install && restart)
{ {
if (restart) RestartApplication();
{
RestartApplication();
}
else
{
_cache.Remove("moduledefinitions");
_cache.Remove("jobs");
}
} }
} }

View File

@ -1,7 +1,5 @@
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.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.Extensions.Configuration;
using Microsoft.AspNetCore; using Microsoft.AspNetCore;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -14,11 +12,9 @@ namespace Oqtane.Server
public static void Main(string[] args) public static void Main(string[] args)
{ {
var host = BuildWebHost(args); var host = BuildWebHost(args);
// execute any database migrations for the framework or extensions
using (var serviceScope = host.Services.GetRequiredService<IServiceScopeFactory>().CreateScope()) using (var serviceScope = host.Services.GetRequiredService<IServiceScopeFactory>().CreateScope())
{ {
var installationManager = serviceScope.ServiceProvider.GetService<IInstallationManager>();
// 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>(); var databaseManager = serviceScope.ServiceProvider.GetService<DatabaseManager>();
databaseManager.StartupMigration(); databaseManager.StartupMigration();
} }

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Caching.Memory;
using Oqtane.Extensions;
using Oqtane.Models; using Oqtane.Models;
using Oqtane.Modules; using Oqtane.Modules;
using Oqtane.Shared; using Oqtane.Shared;
@ -36,7 +37,7 @@ namespace Oqtane.Repository
public void UpdateModuleDefinition(ModuleDefinition moduleDefinition) public void UpdateModuleDefinition(ModuleDefinition moduleDefinition)
{ {
_permissions.UpdatePermissions(moduleDefinition.SiteId, EntityNames.ModuleDefinition, moduleDefinition.ModuleDefinitionId, moduleDefinition.Permissions); _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) public void DeleteModuleDefinition(int moduleDefinitionId, int siteId)
@ -45,27 +46,35 @@ namespace Oqtane.Repository
_permissions.DeletePermissions(siteId, EntityNames.ModuleDefinition, moduleDefinitionId); _permissions.DeletePermissions(siteId, EntityNames.ModuleDefinition, moduleDefinitionId);
_db.ModuleDefinition.Remove(moduleDefinition); _db.ModuleDefinition.Remove(moduleDefinition);
_db.SaveChanges(); _db.SaveChanges();
_cache.Remove("moduledefinitions");
} }
public List<ModuleDefinition> LoadModuleDefinitions(int siteId) public List<ModuleDefinition> LoadModuleDefinitions(int siteId)
{ {
List<ModuleDefinition> moduleDefinitions; // get module definitions for site
List<ModuleDefinition> moduleDefinitions = _cache.GetOrCreate("moduledefinitions:" + siteId.ToString(), entry =>
{
entry.SlidingExpiration = TimeSpan.FromMinutes(30);
return LoadSiteModuleDefinitions(siteId);
});
return moduleDefinitions;
}
// get run-time module definitions private List<ModuleDefinition> LoadSiteModuleDefinitions(int siteId)
moduleDefinitions = _cache.GetOrCreate("moduledefinitions", entry => {
// get module assemblies
List<ModuleDefinition> moduleDefinitions = _cache.GetOrCreate("moduledefinitions", entry =>
{ {
entry.SlidingExpiration = TimeSpan.FromMinutes(30); entry.SlidingExpiration = TimeSpan.FromMinutes(30);
return LoadModuleDefinitionsFromAssemblies(); return LoadModuleDefinitionsFromAssemblies();
}); });
// get module defintion permissions for site // get module definition permissions for site
List<Permission> permissions = _permissions.GetPermissions(siteId, EntityNames.ModuleDefinition).ToList(); List<Permission> permissions = _permissions.GetPermissions(siteId, EntityNames.ModuleDefinition).ToList();
// get module definitions in database // get module definitions in database
List<ModuleDefinition> moduledefs = _db.ModuleDefinition.ToList(); List<ModuleDefinition> moduledefs = _db.ModuleDefinition.ToList();
// sync run-time module definitions with database // sync module assemblies with database
foreach (ModuleDefinition moduledefinition in moduleDefinitions) foreach (ModuleDefinition moduledefinition in moduleDefinitions)
{ {
ModuleDefinition moduledef = moduledefs.Where(item => item.ModuleDefinitionName == moduledefinition.ModuleDefinitionName).FirstOrDefault(); 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)); moduledefinition.Permissions = _permissions.EncodePermissions(permissions.Where(item => item.EntityId == moduledef.ModuleDefinitionId));
} }
// remove module definition from list // remove module definition from list as it is already synced
moduledefs.Remove(moduledef); moduledefs.Remove(moduledef);
} }
moduledefinition.ModuleDefinitionId = moduledef.ModuleDefinitionId; moduledefinition.ModuleDefinitionId = moduledef.ModuleDefinitionId;
moduledefinition.SiteId = siteId; moduledefinition.SiteId = siteId;
@ -104,6 +113,7 @@ namespace Oqtane.Repository
{ {
_permissions.DeletePermissions(siteId, EntityNames.ModuleDefinition, moduledefinition.ModuleDefinitionId); _permissions.DeletePermissions(siteId, EntityNames.ModuleDefinition, moduledefinition.ModuleDefinitionId);
_db.ModuleDefinition.Remove(moduledefinition); // delete _db.ModuleDefinition.Remove(moduledefinition); // delete
_db.SaveChanges();
} }
return moduleDefinitions; return moduleDefinitions;
@ -166,11 +176,18 @@ namespace Oqtane.Repository
moduledefinition.AssemblyName = assembly.FullName.Split(",")[0]; moduledefinition.AssemblyName = assembly.FullName.Split(",")[0];
if (moduledefinition.Categories == "Admin") if (moduledefinition.Categories == "Admin")
{ {
moduledefinition.Permissions = "[{\"PermissionName\":\"Utilize\",\"Permissions\":\"" + Constants.AdminRole + "\"}]"; moduledefinition.Permissions = new List<Permission>
{
new Permission(PermissionNames.Utilize, Constants.AdminRole, true)
}.EncodePermissions();
} }
else else
{ {
moduledefinition.Permissions = "[{\"PermissionName\":\"Utilize\",\"Permissions\":\"" + Constants.AdminRole + ";" + Constants.RegisteredRole + "\"}]"; moduledefinition.Permissions = new List<Permission>
{
new Permission(PermissionNames.Utilize, Constants.AdminRole, true),
new Permission(PermissionNames.Utilize, Constants.RegisteredRole, true)
}.EncodePermissions();
} }
moduledefinitions.Add(moduledefinition); moduledefinitions.Add(moduledefinition);
index = moduledefinitions.FindIndex(item => item.ModuleDefinitionName == qualifiedModuleType); index = moduledefinitions.FindIndex(item => item.ModuleDefinitionName == qualifiedModuleType);

View File

@ -153,7 +153,14 @@ namespace Oqtane
services.AddSingleton<IInstallationManager, InstallationManager>(); services.AddSingleton<IInstallationManager, InstallationManager>();
services.AddSingleton<ISyncManager, SyncManager>(); services.AddSingleton<ISyncManager, SyncManager>();
services.AddSingleton<DatabaseManager>(); services.AddSingleton<DatabaseManager>();
// 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<IInstallationManager>();
InstallationManager.InstallPackages("Modules,Themes", false);
// register transient scoped core services // register transient scoped core services
services.AddTransient<IModuleDefinitionRepository, ModuleDefinitionRepository>(); services.AddTransient<IModuleDefinitionRepository, ModuleDefinitionRepository>();
services.AddTransient<IThemeRepository, ThemeRepository>(); services.AddTransient<IThemeRepository, ThemeRepository>();
@ -181,12 +188,13 @@ namespace Oqtane
services.AddTransient<ISiteTemplateRepository, SiteTemplateRepository>(); services.AddTransient<ISiteTemplateRepository, SiteTemplateRepository>();
services.AddTransient<ISqlRepository, SqlRepository>(); services.AddTransient<ISqlRepository, SqlRepository>();
// load the external assemblies into the app domain
services.AddOqtaneModules(); services.AddOqtaneModules();
services.AddOqtaneThemes(); services.AddOqtaneThemes();
services.AddOqtaneSiteTemplates(); services.AddOqtaneSiteTemplates();
services.AddMvc() services.AddMvc()
.AddOqtaneApplicationParts() .AddOqtaneApplicationParts() // register any Controllers from custom modules
.AddNewtonsoftJson(); .AddNewtonsoftJson();
services.AddOqtaneServices(); services.AddOqtaneServices();