ability to specify PageTemplates for modules
This commit is contained in:
		| @ -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<PageTemplate> pageTemplates); | ||||
|         Site InitializeSite(Alias alias); | ||||
|         void CreatePages(Site site, List<PageTemplate> pageTemplates, Alias alias); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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); | ||||
|                 }); | ||||
|             } | ||||
|  | ||||
| @ -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<Site> 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<ModuleDefinition> moduleDefinitions, string version) | ||||
|         { | ||||
|             var pageTemplates = new List<PageTemplate>(); | ||||
|             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<PageTemplate> 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<PageTemplate> pageTemplates) | ||||
|         public void CreatePages(Site site, List<PageTemplate> pageTemplates, Alias alias) | ||||
|         { | ||||
|             List<ModuleDefinition> moduledefinitions = _moduleDefinitionRepository.GetModuleDefinitions(site.SiteId).ToList(); | ||||
|             foreach (PageTemplate pagetemplate in pageTemplates) | ||||
|             List<Page> pages = null; | ||||
|             List<PageModule> pageModules = null; | ||||
|             List<ModuleDefinition> moduleDefinitions = null; | ||||
|  | ||||
|             foreach (PageTemplate pageTemplate in pageTemplates) | ||||
|             { | ||||
|                 int? parentid = null; | ||||
|                 if (pagetemplate.Parent != "") | ||||
|                 if (pageTemplate.AliasName == "*" || alias == null || pageTemplate.AliasName == alias.Name) | ||||
|                 { | ||||
|                     List<Page> 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); | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
| @ -98,7 +98,7 @@ namespace Oqtane.Repository | ||||
|             // get themes | ||||
|             List<Theme> themes = _cache.GetOrCreate($"themes:{_tenants.GetAlias().SiteKey}", entry => | ||||
|             { | ||||
|                 entry.SlidingExpiration = TimeSpan.FromMinutes(30); | ||||
|                 entry.Priority = CacheItemPriority.NeverRemove; | ||||
|                 return ProcessThemes(siteId); | ||||
|             }); | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 sbwalker
					sbwalker