From 23d14c62a50e3accf40832190ec2f1d8ee4b145a Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 3 Dec 2025 15:28:31 -0500 Subject: [PATCH] remove unique index of TenantId and Name from Site table as site name does not need to be unique. Remove TenantId column from Site table as it is not necessary and should be obtained from the Alias. --- Oqtane.Client/Modules/Admin/Site/Index.razor | 12 ++++---- .../Modules/Admin/SystemInfo/Index.razor | 2 +- .../Infrastructure/DatabaseManager.cs | 4 +-- .../Tenant/10000102_RemoveSiteTenantId.cs | 29 +++++++++++++++++++ Oqtane.Server/Services/SiteService.cs | 4 ++- Oqtane.Shared/Models/Site.cs | 15 +++++----- 6 files changed, 49 insertions(+), 17 deletions(-) create mode 100644 Oqtane.Server/Migrations/Tenant/10000102_RemoveSiteTenantId.cs diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index 59e10be5..0ceec1fd 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -683,7 +683,7 @@ { var tenants = await TenantService.GetTenantsAsync(); var _databases = await DatabaseService.GetDatabasesAsync(); - var tenant = tenants.Find(item => item.TenantId == site.TenantId); + var tenant = tenants.Find(item => item.TenantId == PageState.Alias.TenantId); if (tenant != null) { _tenant = tenant.Name; @@ -886,17 +886,17 @@ try { var aliases = await AliasService.GetAliasesAsync(); - if (aliases.Any(item => item.SiteId != PageState.Site.SiteId || item.TenantId != PageState.Site.TenantId)) + if (aliases.Any(item => item.SiteId != PageState.Site.SiteId || item.TenantId != PageState.Alias.TenantId)) { await SiteService.DeleteSiteAsync(PageState.Site.SiteId); await logger.LogInformation("Site Deleted {SiteId}", PageState.Site.SiteId); - foreach (Alias alias in aliases.Where(item => item.SiteId == PageState.Site.SiteId && item.TenantId == PageState.Site.TenantId)) + foreach (Alias alias in aliases.Where(item => item.SiteId == PageState.Site.SiteId && item.TenantId == PageState.Alias.TenantId)) { await AliasService.DeleteAliasAsync(alias.AliasId); } - var redirect = aliases.First(item => item.SiteId != PageState.Site.SiteId || item.TenantId != PageState.Site.TenantId); + var redirect = aliases.First(item => item.SiteId != PageState.Site.SiteId || item.TenantId != PageState.Alias.TenantId); NavigationManager.NavigateTo(PageState.Uri.Scheme + "://" + redirect.Name, true); } else @@ -993,7 +993,7 @@ if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) { _aliases = await AliasService.GetAliasesAsync(); - _aliases = _aliases.Where(item => item.SiteId == PageState.Site.SiteId && item.TenantId == PageState.Site.TenantId).OrderBy(item => item.AliasId).ToList(); + _aliases = _aliases.Where(item => item.SiteId == PageState.Site.SiteId && item.TenantId == PageState.Alias.TenantId).OrderBy(item => item.AliasId).ToList(); } } @@ -1046,7 +1046,7 @@ { if (_aliasid == 0) { - alias = new Alias { SiteId = PageState.Site.SiteId, TenantId = PageState.Site.TenantId, Name = _aliasname, IsDefault = bool.Parse(_defaultalias) }; + alias = new Alias { SiteId = PageState.Site.SiteId, TenantId = PageState.Alias.TenantId, Name = _aliasname, IsDefault = bool.Parse(_defaultalias) }; await AliasService.AddAliasAsync(alias); } else diff --git a/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor b/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor index 6f7c4b02..c64070ff 100644 --- a/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor +++ b/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor @@ -271,7 +271,7 @@ } var tenants = await TenantService.GetTenantsAsync(); - _tenant = tenants.Find(item => item.TenantId == PageState.Site.TenantId).Name; + _tenant = tenants.Find(item => item.TenantId == PageState.Alias.TenantId).Name; _history = await MigrationHistoryService.GetMigrationHistoryAsync(); _initialized = true; diff --git a/Oqtane.Server/Infrastructure/DatabaseManager.cs b/Oqtane.Server/Infrastructure/DatabaseManager.cs index 1d4debe7..afad9465 100644 --- a/Oqtane.Server/Infrastructure/DatabaseManager.cs +++ b/Oqtane.Server/Infrastructure/DatabaseManager.cs @@ -579,7 +579,6 @@ namespace Oqtane.Infrastructure site = new Site { - TenantId = tenant.TenantId, Name = install.SiteName, LogoFileId = null, FaviconFileId = null, @@ -596,7 +595,8 @@ namespace Oqtane.Infrastructure RenderMode = rendermode, Runtime = runtime, Prerender = (rendermode == RenderModes.Interactive), - Hybrid = false + Hybrid = false, + TenantId = tenant.TenantId }; site = sites.AddSite(site); diff --git a/Oqtane.Server/Migrations/Tenant/10000102_RemoveSiteTenantId.cs b/Oqtane.Server/Migrations/Tenant/10000102_RemoveSiteTenantId.cs new file mode 100644 index 00000000..3ac75cbe --- /dev/null +++ b/Oqtane.Server/Migrations/Tenant/10000102_RemoveSiteTenantId.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Oqtane.Databases.Interfaces; +using Oqtane.Migrations.EntityBuilders; +using Oqtane.Repository; + +namespace Oqtane.Migrations.Tenant +{ + [DbContext(typeof(TenantDBContext))] + [Migration("Tenant.10.00.01.02")] + public class RemoveSiteTenantId : MultiDatabaseMigration + { + public RemoveSiteTenantId(IDatabase database) : base(database) + { + } + + protected override void Up(MigrationBuilder migrationBuilder) + { + var siteEntityBuilder = new SiteEntityBuilder(migrationBuilder, ActiveDatabase); + siteEntityBuilder.DropIndex("IX_Site"); // TenantId, Name + siteEntityBuilder.DropColumn("TenantId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + // not implemented + } + } +} diff --git a/Oqtane.Server/Services/SiteService.cs b/Oqtane.Server/Services/SiteService.cs index 25a9ec92..5e43299b 100644 --- a/Oqtane.Server/Services/SiteService.cs +++ b/Oqtane.Server/Services/SiteService.cs @@ -148,6 +148,8 @@ namespace Oqtane.Services // installation date used for fingerprinting static assets site.Fingerprint = Utilities.GenerateSimpleHash(_configManager.GetSetting("InstallationDate", DateTime.UtcNow.ToString("yyyyMMddHHmm"))); + + site.TenantId = alias.TenantId; } else { @@ -181,7 +183,7 @@ namespace Oqtane.Services { var alias = _tenantManager.GetAlias(); var current = _sites.GetSite(site.SiteId, false); - if (site.SiteId == alias.SiteId && site.TenantId == alias.TenantId && current != null) + if (site.SiteId == alias.SiteId && current != null) { site = _sites.UpdateSite(site); _syncManager.AddSyncEvent(alias, EntityNames.Site, site.SiteId, SyncEventActions.Update); diff --git a/Oqtane.Shared/Models/Site.cs b/Oqtane.Shared/Models/Site.cs index a00fa5b1..2b2cb78b 100644 --- a/Oqtane.Shared/Models/Site.cs +++ b/Oqtane.Shared/Models/Site.cs @@ -16,11 +16,6 @@ namespace Oqtane.Models /// public int SiteId { get; set; } - /// - /// Reference to the the Site is in - /// - public int TenantId { get; set; } - /// /// The site Name /// @@ -203,12 +198,17 @@ namespace Oqtane.Models [NotMapped] public string Fingerprint { get; set; } + /// + /// Reference to the the Site belongs to + /// + [NotMapped] + public int TenantId { get; set; } + public Site Clone() { return new Site { SiteId = SiteId, - TenantId = TenantId, Name = Name, TimeZoneId = TimeZoneId, LogoFileId = LogoFileId, @@ -246,7 +246,8 @@ namespace Oqtane.Models Pages = Pages.ConvertAll(page => page.Clone()), Languages = Languages.ConvertAll(language => language.Clone()), Themes = Themes, - Fingerprint = Fingerprint + Fingerprint = Fingerprint, + TenantId = TenantId }; }