From cc9377b37d748f354e153238dc1e27e634c0949b Mon Sep 17 00:00:00 2001 From: sbwalker Date: Mon, 5 Jun 2023 08:22:29 -0400 Subject: [PATCH] improvements for personalized pages --- .../Services/Interfaces/IPageService.cs | 8 --- Oqtane.Client/Services/PageService.cs | 5 -- .../Themes/Controls/Theme/ControlPanel.razor | 4 +- Oqtane.Client/UI/SiteRouter.razor | 27 +++++++--- Oqtane.Server/Controllers/PageController.cs | 50 ++++++------------- .../Repository/Interfaces/IPageRepository.cs | 1 - Oqtane.Server/Repository/PageRepository.cs | 15 ------ 7 files changed, 35 insertions(+), 75 deletions(-) diff --git a/Oqtane.Client/Services/Interfaces/IPageService.cs b/Oqtane.Client/Services/Interfaces/IPageService.cs index 9981f373..2f5c4c6d 100644 --- a/Oqtane.Client/Services/Interfaces/IPageService.cs +++ b/Oqtane.Client/Services/Interfaces/IPageService.cs @@ -23,14 +23,6 @@ namespace Oqtane.Services /// Task GetPageAsync(int pageId); - /// - /// Returns a specific page personalized for the given user - /// - /// - /// - /// - Task GetPageAsync(int pageId, int userId); - /// /// Returns a specific page by its defined path /// diff --git a/Oqtane.Client/Services/PageService.cs b/Oqtane.Client/Services/PageService.cs index 0725ccf8..934b156e 100644 --- a/Oqtane.Client/Services/PageService.cs +++ b/Oqtane.Client/Services/PageService.cs @@ -25,11 +25,6 @@ namespace Oqtane.Services return await GetJsonAsync($"{Apiurl}/{pageId}"); } - public async Task GetPageAsync(int pageId, int userId) - { - return await GetJsonAsync($"{Apiurl}/{pageId}?userid={userId}"); - } - public async Task GetPageAsync(string path, int siteId) { try diff --git a/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor b/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor index 93e26b13..af681625 100644 --- a/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor +++ b/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor @@ -489,9 +489,9 @@ { if (PageState.Page.IsPersonalizable && PageState.User != null) { - await PageService.AddPageAsync(PageState.Page.PageId, PageState.User.UserId); + var page = await PageService.AddPageAsync(PageState.Page.PageId, PageState.User.UserId); PageState.EditMode = true; - NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, "edit=" + ((PageState.EditMode) ? "true" : "false"))); + NavigationManager.NavigateTo(NavigateUrl(page.Path, "edit=" + ((PageState.EditMode) ? "true" : "false"))); } } } diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index 380ce244..5406a11d 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -221,6 +221,23 @@ page = site.Pages.FirstOrDefault(); } } + if (page == null) + { + // look for personalized page + page = await PageService.GetPageAsync(route.PagePath, site.SiteId); + } + else + { + if (user != null && page.IsPersonalizable) + { + page = await PageService.GetPageAsync(route.PagePath + "/" + user.Username, site.SiteId); + if (page != null) + { + // redirect to the personalized page + NavigationManager.NavigateTo(Utilities.NavigateUrl(SiteState.Alias.Path, route.PagePath + "/" + user.Username, ""), false); + } + } + } if (page != null) { @@ -228,7 +245,7 @@ if (UserSecurity.IsAuthorized(user, PermissionNames.View, page.PermissionList)) { // load additional metadata for current page - page = await ProcessPage(page, site, user, SiteState.Alias); + page = ProcessPage(page, site, user, SiteState.Alias); // load additional metadata for modules (page, site.Modules) = ProcessModules(page, site.Modules, moduleid, action, (!string.IsNullOrEmpty(page.DefaultContainerType)) ? page.DefaultContainerType : site.DefaultContainerType, SiteState.Alias); @@ -297,16 +314,10 @@ } } - private async Task ProcessPage(Page page, Site site, User user, Alias alias) + private Page ProcessPage(Page page, Site site, User user, Alias alias) { try { - if (page.IsPersonalizable && user != null) - { - // load the personalized page - page = await PageService.GetPageAsync(page.PageId, user.UserId); - } - if (string.IsNullOrEmpty(page.ThemeType)) { page.ThemeType = site.DefaultThemeType; diff --git a/Oqtane.Server/Controllers/PageController.cs b/Oqtane.Server/Controllers/PageController.cs index d4cc1931..f4a9c62d 100644 --- a/Oqtane.Server/Controllers/PageController.cs +++ b/Oqtane.Server/Controllers/PageController.cs @@ -73,34 +73,6 @@ namespace Oqtane.Controllers return pages; } - // GET api//5?userid=x - [HttpGet("{id}")] - public Page Get(int id, string userid) - { - Page page = null; - if (string.IsNullOrEmpty(userid)) - { - page = _pages.GetPage(id); - } - else - { - page = _pages.GetPage(id, int.Parse(userid)); - } - if (page != null && page.SiteId == _alias.SiteId && _userPermissions.IsAuthorized(User, PermissionNames.View, page.PermissionList)) - { - page.Settings = _settings.GetSettings(EntityNames.Page, page.PageId) - .Where(item => !item.IsPrivate || _userPermissions.IsAuthorized(User, PermissionNames.Edit, page.PermissionList)) - .ToDictionary(setting => setting.SettingName, setting => setting.SettingValue); - return page; - } - else - { - _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Page Get Attempt {PageId} {UserId}", id, userid); - HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden; - return null; - } - } - // GET api//path/x?path=y [HttpGet("path/{siteid}")] public Page Get(string path, int siteid) @@ -180,29 +152,30 @@ namespace Oqtane.Controllers { Page page = null; Page parent = _pages.GetPage(id); - if (parent != null && parent.SiteId == _alias.SiteId && parent.IsPersonalizable && _userPermissions.GetUser(User).UserId == int.Parse(userid)) + User user = _userPermissions.GetUser(User); + if (parent != null && parent.SiteId == _alias.SiteId && parent.IsPersonalizable && user.UserId == int.Parse(userid)) { page = new Page(); page.SiteId = parent.SiteId; - page.Name = parent.Name; - page.Title = parent.Title; - page.Path = parent.Path; page.ParentId = parent.PageId; + page.Name = user.Username; + page.Path = parent.Path + "/" + page.Name; + page.Title = parent.Name + " - " + page.Name; page.Order = 0; page.IsNavigation = false; page.Url = ""; page.ThemeType = parent.ThemeType; page.DefaultContainerType = parent.DefaultContainerType; page.Icon = parent.Icon; - page.PermissionList = new List { + page.PermissionList = new List() + { new Permission(PermissionNames.View, int.Parse(userid), true), + new Permission(PermissionNames.View, RoleNames.Everyone, true), new Permission(PermissionNames.Edit, int.Parse(userid), true) }; page.IsPersonalizable = false; page.UserId = int.Parse(userid); page = _pages.AddPage(page); - _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Page, page.PageId, SyncEventActions.Create); - _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Site, page.SiteId, SyncEventActions.Refresh); // copy modules List pagemodules = _pageModules.GetPageModules(page.SiteId).ToList(); @@ -213,8 +186,10 @@ namespace Oqtane.Controllers module.PageId = page.PageId; module.ModuleDefinitionName = pm.Module.ModuleDefinitionName; module.AllPages = false; - module.PermissionList = new List { + module.PermissionList = new List() + { new Permission(PermissionNames.View, int.Parse(userid), true), + new Permission(PermissionNames.View, RoleNames.Everyone, true), new Permission(PermissionNames.Edit, int.Parse(userid), true) }; module = _modules.AddModule(module); @@ -235,6 +210,9 @@ namespace Oqtane.Controllers _pageModules.AddPageModule(pagemodule); } + + _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Page, page.PageId, SyncEventActions.Create); + _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Site, page.SiteId, SyncEventActions.Refresh); } else { diff --git a/Oqtane.Server/Repository/Interfaces/IPageRepository.cs b/Oqtane.Server/Repository/Interfaces/IPageRepository.cs index 98ce2ef3..12caca4c 100644 --- a/Oqtane.Server/Repository/Interfaces/IPageRepository.cs +++ b/Oqtane.Server/Repository/Interfaces/IPageRepository.cs @@ -10,7 +10,6 @@ namespace Oqtane.Repository Page UpdatePage(Page page); Page GetPage(int pageId); Page GetPage(int pageId, bool tracking); - Page GetPage(int pageId, int userId); Page GetPage(string path, int siteId); void DeletePage(int pageId); } diff --git a/Oqtane.Server/Repository/PageRepository.cs b/Oqtane.Server/Repository/PageRepository.cs index 95032fc9..e3e50200 100644 --- a/Oqtane.Server/Repository/PageRepository.cs +++ b/Oqtane.Server/Repository/PageRepository.cs @@ -71,21 +71,6 @@ namespace Oqtane.Repository return page; } - public Page GetPage(int pageId, int userId) - { - Page page = _db.Page.Find(pageId); - if (page != null) - { - Page personalized = _db.Page.FirstOrDefault(item => item.SiteId == page.SiteId && item.Path == page.Path && item.UserId == userId); - if (personalized != null) - { - page = personalized; - } - page.PermissionList = _permissions.GetPermissions(page.SiteId, EntityNames.Page, page.PageId)?.ToList(); - } - return page; - } - public Page GetPage(string path, int siteId) { Page page = _db.Page.FirstOrDefault(item => item.Path == path && item.SiteId == siteId);