fix #4976 - manage hierarchical path updates and page deletion

This commit is contained in:
sbwalker
2025-01-21 15:57:48 -05:00
parent 16477052e2
commit 90d2e0a40b
4 changed files with 152 additions and 81 deletions

View File

@ -9,6 +9,8 @@ using System.Net;
using Oqtane.Enums;
using Oqtane.Infrastructure;
using Oqtane.Repository;
using System.Xml.Linq;
using Microsoft.AspNetCore.Diagnostics;
namespace Oqtane.Controllers
{
@ -279,18 +281,14 @@ namespace Oqtane.Controllers
// get current page permissions
var currentPermissions = _permissionRepository.GetPermissions(page.SiteId, EntityNames.Page, page.PageId).ToList();
page = _pages.UpdatePage(page);
// preserve new path and deleted status
var newPath = page.Path;
var deleted = page.IsDeleted;
page.Path = currentPage.Path;
page.IsDeleted = currentPage.IsDeleted;
// save url mapping if page path changed
if (currentPage.Path != page.Path)
{
var urlMapping = _urlMappings.GetUrlMapping(page.SiteId, currentPage.Path);
if (urlMapping != null)
{
urlMapping.MappedUrl = page.Path;
_urlMappings.UpdateUrlMapping(urlMapping);
}
}
// update page
UpdatePage(page, page.Path, newPath, deleted);
// get differences between current and new page permissions
var added = GetPermissionsDifferences(page.PermissionList, currentPermissions);
@ -320,6 +318,7 @@ namespace Oqtane.Controllers
});
}
}
// permissions removed
foreach (Permission permission in removed)
{
@ -343,7 +342,6 @@ namespace Oqtane.Controllers
}
}
_syncManager.AddSyncEvent(_alias, EntityNames.Page, page.PageId, SyncEventActions.Update);
_syncManager.AddSyncEvent(_alias, EntityNames.Site, page.SiteId, SyncEventActions.Refresh);
// personalized page
@ -378,6 +376,39 @@ namespace Oqtane.Controllers
return page;
}
private void UpdatePage(Page page, string oldPath, string newPath, bool deleted)
{
var update = false;
if (oldPath != newPath)
{
var urlMapping = _urlMappings.GetUrlMapping(page.SiteId, page.Path);
if (urlMapping != null)
{
urlMapping.MappedUrl = newPath + page.Path.Substring(oldPath.Length);
_urlMappings.UpdateUrlMapping(urlMapping);
}
page.Path = newPath + page.Path.Substring(oldPath.Length);
update = true;
}
if (deleted != page.IsDeleted)
{
page.IsDeleted = deleted;
update = true;
}
if (update)
{
_pages.UpdatePage(page);
_syncManager.AddSyncEvent(_alias, EntityNames.Page, page.PageId, SyncEventActions.Update);
}
// update any children
foreach (var _page in _pages.GetPages(page.SiteId).Where(item => item.ParentId == page.PageId))
{
UpdatePage(_page, oldPath, newPath, deleted);
}
}
private List<Permission> GetPermissionsDifferences(List<Permission> permissions1, List<Permission> permissions2)
{
var differences = new List<Permission>();