From 14480edd67150c98f4cf3420502dad59c0875d10 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Fri, 2 Apr 2021 12:30:20 -0400 Subject: [PATCH] added globally unique identifier for Site ( used string data type to ensure compatibility with multiple database engines ) --- .../Infrastructure/UpgradeManager.cs | 147 ++++++++++-------- Oqtane.Server/Oqtane.Server.csproj | 1 + Oqtane.Server/Repository/SiteRepository.cs | 2 +- Oqtane.Server/Scripts/Tenant.02.00.02.01.sql | 10 ++ Oqtane.Shared/Models/Site.cs | 1 + 5 files changed, 93 insertions(+), 68 deletions(-) create mode 100644 Oqtane.Server/Scripts/Tenant.02.00.02.01.sql diff --git a/Oqtane.Server/Infrastructure/UpgradeManager.cs b/Oqtane.Server/Infrastructure/UpgradeManager.cs index b2385b2b..fc435f10 100644 --- a/Oqtane.Server/Infrastructure/UpgradeManager.cs +++ b/Oqtane.Server/Infrastructure/UpgradeManager.cs @@ -1,6 +1,5 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; -using Oqtane.Extensions; using Oqtane.Models; using Oqtane.Repository; using Oqtane.Shared; @@ -25,80 +24,94 @@ namespace Oqtane.Infrastructure 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) + // core framework upgrade logic - executed for every tenant + using (var scope = _serviceScopeFactory.CreateScope()) { - 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; + // set SiteState based on tenant + var siteState = scope.ServiceProvider.GetRequiredService(); + siteState.Alias = new Alias { TenantId = tenant.TenantId }; + + switch (version) + { + case "1.0.0": + Upgrade_1_0_0(tenant, scope); + break; + case "2.0.2": + Upgrade_2_0_2(tenant, scope); + break; + } } } - private void CreateSitePages(Tenant tenant, List pageTemplates) + private void Upgrade_1_0_0(Tenant tenant, IServiceScope scope) + { + var pageTemplates = new List(); + + // **Note: this code is commented out on purpose - it provides an example of how to programmatically add a page to all existing sites on upgrade + + //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(scope, pageTemplates); + } + + private void Upgrade_2_0_2(Tenant tenant, IServiceScope scope) + { + 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); + } + } + + // initialize SiteGuid + var sites = scope.ServiceProvider.GetRequiredService(); + foreach (Site site in sites.GetSites().ToList()) + { + site.SiteGuid = System.Guid.NewGuid().ToString(); + sites.UpdateSite(site); + } + } + + private void CreateSitePages(IServiceScope scope, List pageTemplates) { if (pageTemplates.Count != 0) { - var processed = new List(); - foreach (Alias alias in _aliases.GetAliases().Where(item => item.TenantId == tenant.TenantId)) + var sites = scope.ServiceProvider.GetRequiredService(); + foreach (Site site in sites.GetSites().ToList()) { - 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); - } - } + sites.CreatePages(site, pageTemplates); } } } diff --git a/Oqtane.Server/Oqtane.Server.csproj b/Oqtane.Server/Oqtane.Server.csproj index 4a6802f5..6048456f 100644 --- a/Oqtane.Server/Oqtane.Server.csproj +++ b/Oqtane.Server/Oqtane.Server.csproj @@ -36,6 +36,7 @@ + diff --git a/Oqtane.Server/Repository/SiteRepository.cs b/Oqtane.Server/Repository/SiteRepository.cs index ba23d218..927871c1 100644 --- a/Oqtane.Server/Repository/SiteRepository.cs +++ b/Oqtane.Server/Repository/SiteRepository.cs @@ -605,7 +605,7 @@ namespace Oqtane.Repository public Site AddSite(Site site) { - + site.SiteGuid = System.Guid.NewGuid().ToString(); _db.Site.Add(site); _db.SaveChanges(); CreateSite(site); diff --git a/Oqtane.Server/Scripts/Tenant.02.00.02.01.sql b/Oqtane.Server/Scripts/Tenant.02.00.02.01.sql new file mode 100644 index 00000000..03e5c566 --- /dev/null +++ b/Oqtane.Server/Scripts/Tenant.02.00.02.01.sql @@ -0,0 +1,10 @@ +/* + +Version 2.0.2 Tenant migration script + +*/ + +ALTER TABLE [dbo].[Site] ADD + [SiteGuid] [char](36) NULL +GO + diff --git a/Oqtane.Shared/Models/Site.cs b/Oqtane.Shared/Models/Site.cs index 49f3524e..5adf1318 100644 --- a/Oqtane.Shared/Models/Site.cs +++ b/Oqtane.Shared/Models/Site.cs @@ -18,6 +18,7 @@ namespace Oqtane.Models public int? PwaAppIconFileId { get; set; } public int? PwaSplashIconFileId { get; set; } public bool AllowRegistration { get; set; } + public string SiteGuid { get; set; } public string CreatedBy { get; set; } public DateTime CreatedOn { get; set; }