diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Tree/EntityTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Tree/EntityTreeControllerBase.cs index 8a5cc27ece..1c7c438f3e 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Tree/EntityTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Tree/EntityTreeControllerBase.cs @@ -73,9 +73,7 @@ public abstract class EntityTreeControllerBase : ManagementApiControllerB } IEntitySlim? entity = siblings.FirstOrDefault(); - Guid? parentKey = entity?.ParentId > 0 - ? EntityService.GetKey(entity.ParentId, ItemObjectType).Result - : Constants.System.RootKey; + Guid? parentKey = GetParentKey(entity); TItem[] treeItemViewModels = MapTreeItemViewModels(parentKey, siblings); @@ -86,6 +84,14 @@ public abstract class EntityTreeControllerBase : ManagementApiControllerB return Ok(result); } + /// + /// Gets the parent key for an entity, or root if null or no parent. + /// + protected virtual Guid? GetParentKey(IEntitySlim? entity) => + entity?.ParentId > 0 + ? EntityService.GetKey(entity.ParentId, ItemObjectType).Result + : Constants.System.RootKey; + protected virtual async Task>> GetAncestors(Guid descendantKey, bool includeSelf = true) { IEntitySlim[] ancestorEntities = await GetAncestorEntitiesAsync(descendantKey, includeSelf); diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Tree/FolderTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Tree/FolderTreeControllerBase.cs index d54e537637..6dfb8738ed 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Tree/FolderTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Tree/FolderTreeControllerBase.cs @@ -45,6 +45,30 @@ public abstract class FolderTreeControllerBase : NamedEntityTreeControlle protected abstract UmbracoObjectTypes FolderObjectType { get; } + /// + protected override Guid? GetParentKey(IEntitySlim? entity) + { + if (entity is null || entity.ParentId <= 0) + { + return Constants.System.RootKey; + } + + Attempt getKeyAttempt = EntityService.GetKey(entity.ParentId, ItemObjectType); + if (getKeyAttempt.Success) + { + return getKeyAttempt.Result; + } + + // Parent could be a folder, so try that too. + getKeyAttempt = EntityService.GetKey(entity.ParentId, FolderObjectType); + if (getKeyAttempt.Success) + { + return getKeyAttempt.Result; + } + + return Constants.System.RootKey; + } + protected void RenderFoldersOnly(bool foldersOnly) => _foldersOnly = foldersOnly; protected override IEntitySlim[] GetPagedRootEntities(int skip, int take, out long totalItems)