using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Oqtane.Extensions; using Oqtane.Models; using Oqtane.Repository; using Oqtane.Shared; using System.Collections.Generic; using System.IO; using System.Linq; namespace Oqtane.Infrastructure { public class UpgradeManager : IUpgradeManager { private readonly IAliasRepository _aliases; private readonly IServiceScopeFactory _serviceScopeFactory; private readonly IWebHostEnvironment _environment; public UpgradeManager(IAliasRepository aliases, IServiceScopeFactory serviceScopeFactory, IWebHostEnvironment environment) { _aliases = aliases; _serviceScopeFactory = serviceScopeFactory; _environment = environment; } public void Upgrade(Tenant tenant, string version) { // core framework upgrade logic - note that you can check if current tenant is Master if you only want to execute the logic once switch (version) { case "0.9.0": // this code is commented out on purpose - it provides an example of how to programmatically add a page to all existing sites on upgrade var pageTemplates = new List(); //pageTemplates.Add(new PageTemplate //{ // Name = "Test", // Parent = "", // Path = "test", // Icon = Icons.Badge, // IsNavigation = true, // IsPersonalizable = false, // EditMode = false, // PagePermissions = new List // { // new Permission(PermissionNames.View, RoleNames.Admin, true), // new Permission(PermissionNames.View, RoleNames.Everyone, true), // new Permission(PermissionNames.Edit, RoleNames.Admin, true) // }.EncodePermissions(), // PageTemplateModules = new List // { // new PageTemplateModule // { // ModuleDefinitionName = typeof(Oqtane.Modules.Admin.Login.Index).ToModuleDefinitionName(), Title = "Test", Pane = "Content", // ModulePermissions = new List // { // new Permission(PermissionNames.View, RoleNames.Admin, true), // new Permission(PermissionNames.View, RoleNames.Everyone, true), // new Permission(PermissionNames.Edit, RoleNames.Admin, true) // }.EncodePermissions(), // Content = "" // } // } //}); CreateSitePages(tenant, pageTemplates); break; case "2.0.2": if (tenant.Name == TenantNames.Master) { // remove Internal module template files as they are no longer supported var internalTemplatePath = Utilities.PathCombine(_environment.WebRootPath, "Modules", "Templates", "Internal", Path.DirectorySeparatorChar.ToString()); if (Directory.Exists(internalTemplatePath)) { Directory.Delete(internalTemplatePath, true); } } break; } } private void CreateSitePages(Tenant tenant, List pageTemplates) { if (pageTemplates.Count != 0) { var processed = new List(); foreach (Alias alias in _aliases.GetAliases().Where(item => item.TenantId == tenant.TenantId)) { if (!processed.Exists(item => item.SiteId == alias.SiteId)) { using (var scope = _serviceScopeFactory.CreateScope()) { var siteState = scope.ServiceProvider.GetRequiredService(); siteState.Alias = alias; var sites = scope.ServiceProvider.GetRequiredService(); var site = sites.GetSite(alias.SiteId); if (site != null) { sites.CreatePages(site, pageTemplates); } processed.Add(site); } } } } } } }