diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index a7f69bb4..c3abedbb 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -52,7 +52,13 @@ - +
+ +
+ +
+
+
@@ -345,6 +351,7 @@ private string _homepageid = "-"; private string _isdeleted; private string _sitemap = ""; + private string _version = ""; private int _logofileid = -1; private FileManager _logofilemanager; private int _faviconfileid = -1; @@ -402,6 +409,7 @@ } _isdeleted = site.IsDeleted.ToString(); _sitemap = PageState.Alias.Protocol + PageState.Alias.Name + "/pages/sitemap.xml"; + _version = site.Version; // appearance if (site.LogoFileId != null) diff --git a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx index 0f9d634e..0c5655db 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx @@ -375,4 +375,10 @@ Enabled? + + The site version (for site content migrations) + + + Version: + \ No newline at end of file diff --git a/Oqtane.Server/Infrastructure/DatabaseManager.cs b/Oqtane.Server/Infrastructure/DatabaseManager.cs index 69776d0c..66dd2cea 100644 --- a/Oqtane.Server/Infrastructure/DatabaseManager.cs +++ b/Oqtane.Server/Infrastructure/DatabaseManager.cs @@ -199,10 +199,6 @@ namespace Oqtane.Infrastructure if (result.Success) { result = CreateSite(install); - if (result.Success) - { - result = MigrateSites(); - } } } } @@ -685,77 +681,6 @@ namespace Oqtane.Infrastructure return result; } - private Installation MigrateSites() - { - var result = new Installation { Success = false, Message = string.Empty }; - - // get site upgrades - Dictionary siteupgrades = new Dictionary(); - var assemblies = AppDomain.CurrentDomain.GetOqtaneAssemblies(); - foreach (Assembly assembly in assemblies) - { - foreach (var type in assembly.GetTypes(typeof(ISiteMigration))) - { - if (Attribute.IsDefined(type, typeof(SiteMigrationAttribute))) - { - var attribute = (SiteMigrationAttribute)Attribute.GetCustomAttribute(type, typeof(SiteMigrationAttribute)); - siteupgrades.Add(attribute.AliasName + " " + attribute.Version, type); - } - } - } - - // execute site upgrades - if (siteupgrades.Count > 0) - { - using (var scope = _serviceScopeFactory.CreateScope()) - { - var aliases = scope.ServiceProvider.GetRequiredService(); - var tenantManager = scope.ServiceProvider.GetRequiredService(); - var sites = scope.ServiceProvider.GetRequiredService(); - var logger = scope.ServiceProvider.GetRequiredService(); - - foreach (var alias in aliases.GetAliases().ToList().Where(item => item.IsDefault)) - { - foreach (var upgrade in siteupgrades) - { - var aliasname = upgrade.Key.Split(' ').First(); - // in the future this equality condition could use RegEx to allow for more flexible matching - if (string.Equals(alias.Name, aliasname, StringComparison.OrdinalIgnoreCase)) - { - tenantManager.SetTenant(alias.TenantId); - var site = sites.GetSites().FirstOrDefault(item => item.SiteId == alias.SiteId); - if (site != null) - { - var version = upgrade.Key.Split(' ').Last(); - if (string.IsNullOrEmpty(site.Version) || Version.Parse(version) > Version.Parse(site.Version)) - { - try - { - var obj = ActivatorUtilities.CreateInstance(scope.ServiceProvider, upgrade.Value) as ISiteMigration; - if (obj != null) - { - obj.Up(site, alias); - site.Version = version; - sites.UpdateSite(site); - logger.Log(alias.SiteId, Shared.LogLevel.Information, "Site Migration", LogFunction.Other, "Site Migrated Successfully To Version {version} For {Alias}", version, alias.Name); - } - } - catch (Exception ex) - { - logger.Log(alias.SiteId, Shared.LogLevel.Error, "Site Migration", LogFunction.Other, ex, "An Error Occurred Executing Site Migration {Type} For {Alias} And Version {Version}", upgrade.Value, alias.Name, version); - } - } - } - } - } - } - } - } - - result.Success = true; - return result; - } - private string DenormalizeConnectionString(string connectionString) { var dataDirectory = AppDomain.CurrentDomain.GetData(Constants.DataDirectory)?.ToString(); diff --git a/Oqtane.Server/Infrastructure/ServerState.cs b/Oqtane.Server/Infrastructure/ServerState.cs index c37d5e21..6f3ac283 100644 --- a/Oqtane.Server/Infrastructure/ServerState.cs +++ b/Oqtane.Server/Infrastructure/ServerState.cs @@ -8,5 +8,6 @@ namespace Oqtane.Infrastructure public int SiteId { get; set; } public List Assemblies { get; set; } = new List(); public ListScripts { get; set; } = new List(); + public bool IsMigrated { get; set; } = false; } } diff --git a/Oqtane.Server/Infrastructure/UpgradeManager.cs b/Oqtane.Server/Infrastructure/UpgradeManager.cs index b3cf2770..c4d5e91f 100644 --- a/Oqtane.Server/Infrastructure/UpgradeManager.cs +++ b/Oqtane.Server/Infrastructure/UpgradeManager.cs @@ -192,7 +192,7 @@ namespace Oqtane.Infrastructure var sites = scope.ServiceProvider.GetRequiredService(); foreach (Site site in sites.GetSites().ToList()) { - sites.CreatePages(site, pageTemplates); + sites.CreatePages(site, pageTemplates, null); } } @@ -243,7 +243,7 @@ namespace Oqtane.Infrastructure { if (!pages.GetPages(site.SiteId).ToList().Where(item => item.Path == "404").Any()) { - sites.CreatePages(site, pageTemplates); + sites.CreatePages(site, pageTemplates, null); } } } diff --git a/Oqtane.Server/Pages/_Host.cshtml.cs b/Oqtane.Server/Pages/_Host.cshtml.cs index 2cae21ba..ba352e25 100644 --- a/Oqtane.Server/Pages/_Host.cshtml.cs +++ b/Oqtane.Server/Pages/_Host.cshtml.cs @@ -110,7 +110,7 @@ namespace Oqtane.Pages } } - var site = _sites.GetSite(alias.SiteId); + var site = _sites.InitializeSite(alias); if (site != null && !site.IsDeleted && site.Runtime != "Hybrid") { Route route = new Route(url, alias.Path); @@ -174,7 +174,6 @@ namespace Oqtane.Pages } HeadResources += ParseScripts(site.HeadContent); BodyResources += ParseScripts(site.BodyContent); - _sites.InitializeSite(site.SiteId); // populates server state var scripts = _serverState.GetServerState(site.SiteId).Scripts; foreach (var script in scripts) { diff --git a/Oqtane.Server/Repository/Interfaces/ISiteRepository.cs b/Oqtane.Server/Repository/Interfaces/ISiteRepository.cs index ebe3294b..f32123a9 100644 --- a/Oqtane.Server/Repository/Interfaces/ISiteRepository.cs +++ b/Oqtane.Server/Repository/Interfaces/ISiteRepository.cs @@ -11,7 +11,7 @@ namespace Oqtane.Repository Site GetSite(int siteId); Site GetSite(int siteId, bool tracking); void DeleteSite(int siteId); - void InitializeSite(int siteId); - void CreatePages(Site site, List pageTemplates); + Site InitializeSite(Alias alias); + void CreatePages(Site site, List pageTemplates, Alias alias); } } diff --git a/Oqtane.Server/Repository/ModuleDefinitionRepository.cs b/Oqtane.Server/Repository/ModuleDefinitionRepository.cs index 0104d8ea..a82cce99 100644 --- a/Oqtane.Server/Repository/ModuleDefinitionRepository.cs +++ b/Oqtane.Server/Repository/ModuleDefinitionRepository.cs @@ -11,7 +11,6 @@ using Oqtane.Infrastructure; using Oqtane.Models; using Oqtane.Modules; using Oqtane.Shared; -using Oqtane.Themes; namespace Oqtane.Repository { @@ -115,7 +114,7 @@ namespace Oqtane.Repository { moduleDefinitions = _cache.GetOrCreate($"moduledefinitions:{_tenants.GetAlias().SiteKey}", entry => { - entry.SlidingExpiration = TimeSpan.FromMinutes(30); + entry.Priority = CacheItemPriority.NeverRemove; return ProcessModuleDefinitions(siteId); }); } diff --git a/Oqtane.Server/Repository/SiteRepository.cs b/Oqtane.Server/Repository/SiteRepository.cs index 492b3af0..e06d4731 100644 --- a/Oqtane.Server/Repository/SiteRepository.cs +++ b/Oqtane.Server/Repository/SiteRepository.cs @@ -1,11 +1,11 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; +using System.Reflection; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Oqtane.Extensions; +using Oqtane.Enums; using Oqtane.Infrastructure; using Oqtane.Models; using Oqtane.Modules; @@ -27,10 +27,13 @@ namespace Oqtane.Repository private readonly IThemeRepository _themeRepository; private readonly IServiceProvider _serviceProvider; private readonly IConfigurationRoot _config; + private readonly ServerStateManager _serverState; + private readonly ILogManager _logger; + private static readonly object _lock = new object(); public SiteRepository(TenantDBContext context, IRoleRepository roleRepository, IProfileRepository profileRepository, IFolderRepository folderRepository, IPageRepository pageRepository, IModuleRepository moduleRepository, IPageModuleRepository pageModuleRepository, IModuleDefinitionRepository moduleDefinitionRepository, IThemeRepository themeRepository, IServiceProvider serviceProvider, - IConfigurationRoot config) + IConfigurationRoot config, ServerStateManager serverState, ILogManager logger) { _db = context; _roleRepository = roleRepository; @@ -43,6 +46,8 @@ namespace Oqtane.Repository _themeRepository = themeRepository; _serviceProvider = serviceProvider; _config = config; + _serverState = serverState; + _logger = logger; } public IEnumerable GetSites() @@ -90,10 +95,112 @@ namespace Oqtane.Repository _db.SaveChanges(); } - public void InitializeSite(int siteId) + public Site InitializeSite(Alias alias) { - _moduleDefinitionRepository.GetModuleDefinitions(siteId); + var site = GetSite(alias.SiteId); + _themeRepository.GetThemes(); + var moduleDefinitions = _moduleDefinitionRepository.GetModuleDefinitions(alias.SiteId); + + // site migrations + var serverstate = _serverState.GetServerState(alias.SiteId); + if (!serverstate.IsMigrated) + { + // ensure migrations are only executed once + lock (_lock) + { + if (!serverstate.IsMigrated) + { + var version = ProcessSiteMigrations(alias, site); + version = ProcessPageTemplates(alias, site, moduleDefinitions, version); + if (site.Version != version) + { + site.Version = version; + UpdateSite(site); + } + serverstate.IsMigrated = true; + _serverState.SetServerState(alias.SiteId, serverstate); + } + } + } + + return site; + } + + private string ProcessSiteMigrations(Alias alias, Site site) + { + var version = site.Version; + var assemblies = AppDomain.CurrentDomain.GetOqtaneAssemblies(); + foreach (Assembly assembly in assemblies) + { + foreach (var type in assembly.GetTypes(typeof(ISiteMigration))) + { + if (Attribute.IsDefined(type, typeof(SiteMigrationAttribute))) + { + var attribute = (SiteMigrationAttribute)Attribute.GetCustomAttribute(type, typeof(SiteMigrationAttribute)); + if (attribute.AliasName == "*" || attribute.AliasName == alias.Name) + { + if (string.IsNullOrEmpty(site.Version) || Version.Parse(attribute.Version) > Version.Parse(site.Version)) + { + try + { + var obj = ActivatorUtilities.CreateInstance(_serviceProvider, type) as ISiteMigration; + if (obj != null) + { + obj.Up(site, alias); + _logger.Log(LogLevel.Information, "Site Migration", LogFunction.Other, "Site Migrated Successfully To Version {version} For {Alias}", version, alias.Name); + } + } + catch (Exception ex) + { + _logger.Log(LogLevel.Error, "Site Migration", LogFunction.Other, ex, "An Error Occurred Executing Site Migration {Type} For {Alias} And Version {Version}", type, alias.Name, version); + } + if (string.IsNullOrEmpty(version) || Version.Parse(attribute.Version) > Version.Parse(version)) + { + version = attribute.Version; + } + } + } + } + } + } + return version; + } + + private string ProcessPageTemplates(Alias alias, Site site, IEnumerable moduleDefinitions, string version) + { + var pageTemplates = new List(); + foreach (var moduleDefinition in moduleDefinitions) + { + if (moduleDefinition.PageTemplates != null) + { + foreach (var pageTemplate in moduleDefinition.PageTemplates) + { + if (pageTemplate.PageTemplateModules.Count == 0) + { + pageTemplate.PageTemplateModules.Add(new PageTemplateModule()); + } + foreach (var pageTemplateModule in pageTemplate.PageTemplateModules) + { + if (string.IsNullOrEmpty(pageTemplateModule.ModuleDefinitionName)) + { + pageTemplateModule.ModuleDefinitionName = moduleDefinition.ModuleDefinitionName; + } + if (string.IsNullOrEmpty(pageTemplateModule.Title)) + { + pageTemplateModule.Title = moduleDefinition.Name; + } + } + pageTemplates.Add(pageTemplate); + if (pageTemplate.Version != "*" && (string.IsNullOrEmpty(version) || Version.Parse(pageTemplate.Version) > Version.Parse(version))) + { + version = pageTemplate.Version; + } + } + } + } + CreatePages(site, pageTemplates, alias); + return version; } private void CreateSite(Site site) @@ -188,90 +295,179 @@ namespace Oqtane.Repository List pageTemplates = ((ISiteTemplate) siteTemplateObject).CreateSite(site); if (pageTemplates != null && pageTemplates.Count > 0) { - CreatePages(site, pageTemplates); + CreatePages(site, pageTemplates, null); } } // create admin pages - CreatePages(site, CreateAdminPages()); + CreatePages(site, CreateAdminPages(), null); } - public void CreatePages(Site site, List pageTemplates) + public void CreatePages(Site site, List pageTemplates, Alias alias) { - List moduledefinitions = _moduleDefinitionRepository.GetModuleDefinitions(site.SiteId).ToList(); - foreach (PageTemplate pagetemplate in pageTemplates) + List pages = null; + List pageModules = null; + List moduleDefinitions = null; + + foreach (PageTemplate pageTemplate in pageTemplates) { - int? parentid = null; - if (pagetemplate.Parent != "") + if (pageTemplate.AliasName == "*" || alias == null || pageTemplate.AliasName == alias.Name) { - List pages = _pageRepository.GetPages(site.SiteId).ToList(); - Page parent = pages.Where(item => item.Name == pagetemplate.Parent).FirstOrDefault(); - parentid = parent.PageId; - } - - Page page = new Page - { - SiteId = site.SiteId, - ParentId = parentid, - Name = pagetemplate.Name, - Title = "", - Path = pagetemplate.Path, - Order = (pagetemplate.Order == 0) ? 1 : pagetemplate.Order, - Url = "", - IsNavigation = pagetemplate.IsNavigation, - ThemeType = "", - DefaultContainerType = "", - Icon = pagetemplate.Icon, - PermissionList = pagetemplate.PermissionList, - IsPersonalizable = pagetemplate.IsPersonalizable, - UserId = null, - IsClickable = true - }; - page = _pageRepository.AddPage(page); - - foreach (PageTemplateModule pagetemplatemodule in pagetemplate.PageTemplateModules) - { - if (pagetemplatemodule.ModuleDefinitionName != "") + if (string.IsNullOrEmpty(site.Version) || pageTemplate.Version == "*" || Version.Parse(pageTemplate.Version) > Version.Parse(site.Version)) { - ModuleDefinition moduledefinition = moduledefinitions.Where(item => item.ModuleDefinitionName == pagetemplatemodule.ModuleDefinitionName).FirstOrDefault(); - if (moduledefinition != null) + if (pages == null) { - Module module = new Module + pages = _pageRepository.GetPages(site.SiteId).ToList(); + } + var page = pages.FirstOrDefault(item => item.Path == pageTemplate.Path); + if (page == null) + { + page = new Page(); + page.SiteId = site.SiteId; + page.Path = pageTemplate.Path.ToLower(); + } + page.Name = (string.IsNullOrEmpty(pageTemplate.Name)) ? page.Path : pageTemplate.Name; + page.Name = (page.Name.Contains("/")) ? page.Name.Substring(page.Name.LastIndexOf("/") + 1) : page.Name; + int? parentid = null; + if (!string.IsNullOrEmpty(pageTemplate.Parent)) + { + if (pages.Any(item => item.Path.ToLower() == pageTemplate.Parent.ToLower())) { - SiteId = site.SiteId, - ModuleDefinitionName = pagetemplatemodule.ModuleDefinitionName, - AllPages = false, - PermissionList = pagetemplatemodule.PermissionList, - }; - module = _moduleRepository.AddModule(module); - - if (pagetemplatemodule.Content != "" && moduledefinition.ServerManagerType!= "") + parentid = pages.FirstOrDefault(item => item.Path.ToLower() == pageTemplate.Parent.ToLower()).PageId; + } + } + page.ParentId = parentid; + page.Title = pageTemplate.Title; + page.Order = pageTemplate.Order; + page.Url = pageTemplate.Url; + page.ThemeType = pageTemplate.ThemeType; + page.DefaultContainerType = pageTemplate.DefaultContainerType; + page.HeadContent = pageTemplate.HeadContent; + page.BodyContent = pageTemplate.BodyContent; + page.Icon = pageTemplate.Icon; + page.IsNavigation = pageTemplate.IsNavigation; + page.IsClickable = pageTemplate.IsClickable; + page.IsPersonalizable = pageTemplate.IsPersonalizable; + page.UserId = null; + page.IsDeleted = pageTemplate.IsDeleted; + page.PermissionList = pageTemplate.PermissionList; + try + { + if (page.PageId != 0 && pageTemplate.Update) { - Type moduletype = Type.GetType(moduledefinition.ServerManagerType); - if (moduletype != null && moduletype.GetInterface("IPortable") != null) + page = _pageRepository.UpdatePage(page); + if (alias != null) { - try + _logger.Log(LogLevel.Information, "Site Template", LogFunction.Update, "Page Updated {Page}", page); + } + } + else + { + page = _pageRepository.AddPage(page); + pages.Add(page); + if (alias != null) + { + _logger.Log(LogLevel.Information, "Site Template", LogFunction.Create, "Page Added {Page}", page); + } + } + } + catch (Exception ex) + { + if (alias != null) + { + _logger.Log(LogLevel.Error, "Site Template", LogFunction.Other, ex, "Error Processing Page {Page}", page); + } + } + + if (pageModules == null) + { + pageModules = _pageModuleRepository.GetPageModules(site.SiteId).ToList(); + } + if (moduleDefinitions == null) + { + moduleDefinitions = _moduleDefinitionRepository.GetModuleDefinitions(site.SiteId).ToList(); + } + foreach (PageTemplateModule pageTemplateModule in pageTemplate.PageTemplateModules) + { + var moduleDefinition = moduleDefinitions.Where(item => item.ModuleDefinitionName == pageTemplateModule.ModuleDefinitionName).FirstOrDefault(); + if (moduleDefinition != null) + { + var pageModule = pageModules.FirstOrDefault(item => item.PageId == page.PageId && item.Module.ModuleDefinitionName == pageTemplateModule.ModuleDefinitionName && item.Title == pageTemplateModule.Title); + if (pageModule == null) + { + pageModule = new PageModule(); + pageModule.PageId = page.PageId; + pageModule.Module = new Module(); + pageModule.Module.SiteId = site.SiteId; + pageModule.Module.ModuleDefinitionName = pageTemplateModule.ModuleDefinitionName; + } + pageModule.Title = pageTemplateModule.Title; + pageModule.Pane = pageTemplateModule.Pane; + pageModule.ContainerType = pageTemplateModule.ContainerType; + pageModule.IsDeleted = pageTemplateModule.IsDeleted; + pageModule.Module.PermissionList = pageTemplateModule.PermissionList; + pageModule.Module.AllPages = false; + pageModule.Module.IsDeleted = false; + try + { + if (pageModule.ModuleId != 0 && pageTemplate.Update) { - var moduleobject = ActivatorUtilities.CreateInstance(_serviceProvider, moduletype); - ((IPortable)moduleobject).ImportModule(module, pagetemplatemodule.Content, moduledefinition.Version); + _moduleRepository.UpdateModule(pageModule.Module); + _pageModuleRepository.UpdatePageModule(pageModule); + if (alias != null) + { + _logger.Log(LogLevel.Information, "Site Template", LogFunction.Update, "Page Mopdule Updated {PageModule}", pageModule); + } } - catch + else { - // error in IPortable implementation + pageModule.Module = _moduleRepository.AddModule(pageModule.Module); + pageModule.ModuleId = pageModule.Module.ModuleId; + pageModule.Module = null; // remove tracking + _pageModuleRepository.AddPageModule(pageModule); + if (alias != null) + { + _logger.Log(LogLevel.Information, "Site Template", LogFunction.Create, "Page Mopdule Added {PageModule}", pageModule); + } + } + + } + catch (Exception ex) + { + if (alias != null) + { + _logger.Log(LogLevel.Error, "Site Template", LogFunction.Other, ex, "Error Processing Page Module {PageModule}", pageModule); + } + } + + if (pageTemplateModule.Content != "" && moduleDefinition.ServerManagerType != "") + { + Type moduletype = Type.GetType(moduleDefinition.ServerManagerType); + if (moduletype != null && moduletype.GetInterface("IPortable") != null) + { + try + { + var module = _moduleRepository.GetModule(pageModule.ModuleId); + var moduleobject = ActivatorUtilities.CreateInstance(_serviceProvider, moduletype); + ((IPortable)moduleobject).ImportModule(module, pageTemplateModule.Content, moduleDefinition.Version); + } + catch (Exception ex) + { + if (alias != null) + { + _logger.Log(LogLevel.Error, "Site Template", LogFunction.Other, ex, "Error Importing Content For {ModuleDefinitionName}", pageTemplateModule.ModuleDefinitionName); + } + } } } } - - PageModule pagemodule = new PageModule + else { - PageId = page.PageId, - ModuleId = module.ModuleId, - Title = pagetemplatemodule.Title, - Pane = pagetemplatemodule.Pane, - Order = 1, - ContainerType = "" - }; - _pageModuleRepository.AddPageModule(pagemodule); + if (alias != null) + { + _logger.Log(LogLevel.Error, "Site Template", LogFunction.Other, "Module Definition Does Not Exist {ModuleDefinitionName}", pageTemplateModule.ModuleDefinitionName); + } + } } } } diff --git a/Oqtane.Server/Repository/ThemeRepository.cs b/Oqtane.Server/Repository/ThemeRepository.cs index cf1aa1bd..2ca82c36 100644 --- a/Oqtane.Server/Repository/ThemeRepository.cs +++ b/Oqtane.Server/Repository/ThemeRepository.cs @@ -98,7 +98,7 @@ namespace Oqtane.Repository // get themes List themes = _cache.GetOrCreate($"themes:{_tenants.GetAlias().SiteKey}", entry => { - entry.SlidingExpiration = TimeSpan.FromMinutes(30); + entry.Priority = CacheItemPriority.NeverRemove; return ProcessThemes(siteId); }); diff --git a/Oqtane.Shared/Models/ModuleDefinition.cs b/Oqtane.Shared/Models/ModuleDefinition.cs index 961855a8..44f3cd65 100644 --- a/Oqtane.Shared/Models/ModuleDefinition.cs +++ b/Oqtane.Shared/Models/ModuleDefinition.cs @@ -35,6 +35,8 @@ namespace Oqtane.Models Runtimes = ""; Template = ""; Resources = null; + IsAutoEnabled = true; + PageTemplates = null; } /// @@ -111,7 +113,10 @@ namespace Oqtane.Models public List Resources { get; set; } // added in 4.0.0 [NotMapped] - public bool IsAutoEnabled { get; set; } = true; // added in 4.0.0 + public bool IsAutoEnabled { get; set; } // added in 4.0.0 + + [NotMapped] + public List PageTemplates { get; set; } // added in 4.0.0 // internal properties [NotMapped] diff --git a/Oqtane.Shared/Models/Page.cs b/Oqtane.Shared/Models/Page.cs index aa3c2d3d..c4c74a9a 100644 --- a/Oqtane.Shared/Models/Page.cs +++ b/Oqtane.Shared/Models/Page.cs @@ -21,6 +21,12 @@ namespace Oqtane.Models /// public int SiteId { get; set; } + /// + /// Path of the page. + /// TODO: todoc relative to what? site root, parent-page, domain? + /// + public string Path { get; set; } + /// /// Reference to the parent if it has one. /// @@ -36,13 +42,7 @@ namespace Oqtane.Models /// Page Title which is shown in the browser tab. /// public string Title { get; set; } - - /// - /// Path of the page. - /// TODO: todoc relative to what? site root, parent-page, domain? - /// - public string Path { get; set; } - + /// /// Sort order in the list of other sibling pages /// diff --git a/Oqtane.Shared/Models/SiteTemplate.cs b/Oqtane.Shared/Models/SiteTemplate.cs index 885b99ab..7d9e3a5e 100644 --- a/Oqtane.Shared/Models/SiteTemplate.cs +++ b/Oqtane.Shared/Models/SiteTemplate.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -using System.ComponentModel.DataAnnotations.Schema; using System.Text.Json; +using Oqtane.Shared; namespace Oqtane.Models { @@ -13,16 +13,59 @@ namespace Oqtane.Models public class PageTemplate { - public string Name { get; set; } - public string Parent { get; set; } - public int Order { get; set; } + public PageTemplate() + { + Url = ""; + Name = ""; + Parent = ""; + Title = ""; + Path = ""; + Order = 1; + ThemeType = ""; + DefaultContainerType = ""; + HeadContent = ""; + BodyContent = ""; + Icon = ""; + IsNavigation = true; + IsClickable = true; + IsPersonalizable = false; + IsDeleted = false; + PermissionList = new List() + { + new Permission(PermissionNames.View, RoleNames.Admin, true), + new Permission(PermissionNames.Edit, RoleNames.Admin, true) + }; + PageTemplateModules = new List(); + + // properties used by IModule + AliasName = "*"; + Version = "*"; + Update = false; + } + public string Path { get; set; } + public string Parent { get; set; } + public string Name { get; set; } + public string Title { get; set; } + public int Order { get; set; } + public string Url { get; set; } + public string ThemeType { get; set; } + public string DefaultContainerType { get; set; } + public string HeadContent { get; set; } + public string BodyContent { get; set; } public string Icon { get; set; } public bool IsNavigation { get; set; } + public bool IsClickable { get; set; } public bool IsPersonalizable { get; set; } + public bool IsDeleted { get; set; } public List PermissionList { get; set; } public List PageTemplateModules { get; set; } + // properties used by IModule + public string AliasName { get; set; } + public string Version { get; set; } + public bool Update { get; set; } + [Obsolete("This property is obsolete", false)] public bool EditMode { get; set; } @@ -42,9 +85,28 @@ namespace Oqtane.Models public class PageTemplateModule { + public PageTemplateModule() + { + ModuleDefinitionName = ""; + Title = ""; + Pane = PaneNames.Default; + Order = 1; + ContainerType = ""; + IsDeleted = false; + PermissionList = new List() + { + new Permission(PermissionNames.View, RoleNames.Admin, true), + new Permission(PermissionNames.Edit, RoleNames.Admin, true) + }; + Content = ""; + } + public string ModuleDefinitionName { get; set; } public string Title { get; set; } public string Pane { get; set; } + public int Order { get; set; } + public string ContainerType { get; set; } + public bool IsDeleted { get; set; } public List PermissionList { get; set; } public string Content { get; set; }