diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Document/RecycleBin/DocumentRecycleBinControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Document/RecycleBin/DocumentRecycleBinControllerBase.cs index 42944736f6..345775d694 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Document/RecycleBin/DocumentRecycleBinControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Document/RecycleBin/DocumentRecycleBinControllerBase.cs @@ -27,7 +27,7 @@ public class DocumentRecycleBinControllerBase : RecycleBinControllerBase UmbracoObjectTypes.Document; - protected override Guid RecycleBindRootKey => Constants.System.RecycleBinContentKey; + protected override Guid RecycleBinRootKey => Constants.System.RecycleBinContentKey; protected override DocumentRecycleBinItemResponseModel MapRecycleBinViewModel(Guid? parentId, IEntitySlim entity) { diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Media/RecycleBin/MediaRecycleBinControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Media/RecycleBin/MediaRecycleBinControllerBase.cs index 60e913850c..98c2486c95 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Media/RecycleBin/MediaRecycleBinControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Media/RecycleBin/MediaRecycleBinControllerBase.cs @@ -27,7 +27,7 @@ public class MediaRecycleBinControllerBase : RecycleBinControllerBase UmbracoObjectTypes.Media; - protected override Guid RecycleBindRootKey => Constants.System.RecycleBinMediaKey; + protected override Guid RecycleBinRootKey => Constants.System.RecycleBinMediaKey; protected override MediaRecycleBinItemResponseModel MapRecycleBinViewModel(Guid? parentKey, IEntitySlim entity) { diff --git a/src/Umbraco.Cms.Api.Management/Controllers/RecycleBin/RecycleBinControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/RecycleBin/RecycleBinControllerBase.cs index 978eafc39c..02911daa97 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/RecycleBin/RecycleBinControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/RecycleBin/RecycleBinControllerBase.cs @@ -26,7 +26,7 @@ public abstract class RecycleBinControllerBase : ContentControllerBase protected abstract UmbracoObjectTypes ItemObjectType { get; } - protected abstract Guid RecycleBindRootKey { get; } + protected abstract Guid RecycleBinRootKey { get; } protected async Task>> GetRoot(int skip, int take) { @@ -112,7 +112,7 @@ public abstract class RecycleBinControllerBase : ContentControllerBase private IEntitySlim[] GetPagedRootEntities(int skip, int take, out long totalItems) { IEntitySlim[] rootEntities = _entityService - .GetPagedTrashedChildren(RecycleBindRootKey, ItemObjectType, skip, take, out totalItems) + .GetPagedTrashedChildren(RecycleBinRootKey, ItemObjectType, skip, take, out totalItems) .ToArray(); return rootEntities; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Tree/FolderTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Tree/FolderTreeControllerBase.cs index 08239688f6..9db5248069 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Tree/FolderTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Tree/FolderTreeControllerBase.cs @@ -69,6 +69,7 @@ public abstract class FolderTreeControllerBase : NamedEntityTreeControlle ? Array.Empty() : EntityService.GetPagedChildren( parentKey, + new [] { FolderObjectType, ItemObjectType }, ItemObjectType, skip, take, diff --git a/src/Umbraco.Core/Services/EntityService.cs b/src/Umbraco.Core/Services/EntityService.cs index d9c96a884d..d2941e919c 100644 --- a/src/Umbraco.Core/Services/EntityService.cs +++ b/src/Umbraco.Core/Services/EntityService.cs @@ -359,8 +359,27 @@ public class EntityService : RepositoryService, IEntityService => GetPagedChildren(id, objectType, pageIndex, pageSize, false, filter, ordering, out totalRecords); public IEnumerable GetPagedChildren( - Guid? key, - UmbracoObjectTypes objectType, + Guid? parentKey, + UmbracoObjectTypes childObjectType, + int skip, + int take, + out long totalRecords, + IQuery? filter = null, + Ordering? ordering = null) + => GetPagedChildren( + parentKey, + new[] { childObjectType }, + childObjectType, + skip, + take, + out totalRecords, + filter, + ordering); + + public IEnumerable GetPagedChildren( + Guid? parentKey, + IEnumerable parentObjectTypes, + UmbracoObjectTypes childObjectType, int skip, int take, out long totalRecords, @@ -369,7 +388,9 @@ public class EntityService : RepositoryService, IEntityService { using ICoreScope scope = ScopeProvider.CreateCoreScope(); - if (ResolveKey(key, objectType, out int parentId) is false) + var parentId = 0; + var parentIdResolved = parentObjectTypes.Any(parentObjectType => ResolveKey(parentKey, parentObjectType, out parentId)); + if (parentIdResolved is false) { totalRecords = 0; return Enumerable.Empty(); @@ -379,7 +400,7 @@ public class EntityService : RepositoryService, IEntityService IEnumerable children = GetPagedChildren( parentId, - objectType, + childObjectType, pageNumber, pageSize, out totalRecords, @@ -401,7 +422,7 @@ public class EntityService : RepositoryService, IEntityService Ordering? ordering = null) => GetPagedChildren(id, objectType, pageIndex, pageSize, true, filter, ordering, out totalRecords); - IEnumerable GetPagedTrashedChildren( + public IEnumerable GetPagedTrashedChildren( Guid? key, UmbracoObjectTypes objectType, int skip, diff --git a/src/Umbraco.Core/Services/IEntityService.cs b/src/Umbraco.Core/Services/IEntityService.cs index ad64b7f2ac..a2ee9f11a3 100644 --- a/src/Umbraco.Core/Services/IEntityService.cs +++ b/src/Umbraco.Core/Services/IEntityService.cs @@ -202,8 +202,27 @@ public interface IEntityService IEnumerable GetDescendants(int id, UmbracoObjectTypes objectType); IEnumerable GetPagedChildren( - Guid? key, - UmbracoObjectTypes objectType, + Guid? parentKey, + UmbracoObjectTypes childObjectType, + int skip, + int take, + out long totalRecords, + IQuery? filter = null, + Ordering? ordering = null) + => GetPagedChildren( + parentKey, + new[] { childObjectType }, + childObjectType, + skip, + take, + out totalRecords, + filter, + ordering); + + IEnumerable GetPagedChildren( + Guid? parentKey, + IEnumerable parentObjectTypes, + UmbracoObjectTypes childObjectType, int skip, int take, out long totalRecords, diff --git a/src/Umbraco.Core/Services/IdKeyMap.cs b/src/Umbraco.Core/Services/IdKeyMap.cs index 7aa746ae27..2dff4e3cd3 100644 --- a/src/Umbraco.Core/Services/IdKeyMap.cs +++ b/src/Umbraco.Core/Services/IdKeyMap.cs @@ -115,6 +115,16 @@ public class IdKeyMap : IIdKeyMap, IDisposable public Attempt GetIdForKey(Guid key, UmbracoObjectTypes umbracoObjectType) { + if (key == Constants.System.RecycleBinContentKey && umbracoObjectType == UmbracoObjectTypes.Document) + { + return Attempt.Succeed(Constants.System.RecycleBinContent); + } + + if (key == Constants.System.RecycleBinMediaKey && umbracoObjectType == UmbracoObjectTypes.Media) + { + return Attempt.Succeed(Constants.System.RecycleBinMedia); + } + bool empty; try @@ -232,6 +242,16 @@ public class IdKeyMap : IIdKeyMap, IDisposable public Attempt GetKeyForId(int id, UmbracoObjectTypes umbracoObjectType) { + if (id == Constants.System.RecycleBinContent && umbracoObjectType == UmbracoObjectTypes.Document) + { + return Attempt.Succeed(Constants.System.RecycleBinContentKey); + } + + if (id == Constants.System.RecycleBinMedia && umbracoObjectType == UmbracoObjectTypes.Media) + { + return Attempt.Succeed(Constants.System.RecycleBinMediaKey); + } + bool empty; try diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Services/IdKeyMapTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Services/IdKeyMapTests.cs new file mode 100644 index 0000000000..3f267fee1b --- /dev/null +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Services/IdKeyMapTests.cs @@ -0,0 +1,48 @@ +using Moq; +using NUnit.Framework; +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Persistence.Repositories; +using Umbraco.Cms.Core.Scoping; +using Umbraco.Cms.Core.Services; + +namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Services; + +[TestFixture] +public class IdKeyMapTests +{ + private IdKeyMap GetSubject() + => new IdKeyMap(Mock.Of(), Mock.Of()); + + [Test] + public void CanResolveContentRecycleBinIdFromKey() + { + var result = GetSubject().GetIdForKey(Constants.System.RecycleBinContentKey, UmbracoObjectTypes.Document); + Assert.IsTrue(result.Success); + Assert.AreEqual(Constants.System.RecycleBinContent, result.Result); + } + + [Test] + public void CanResolveMediaRecycleBinIdFromKey() + { + var result = GetSubject().GetIdForKey(Constants.System.RecycleBinMediaKey, UmbracoObjectTypes.Media); + Assert.IsTrue(result.Success); + Assert.AreEqual(Constants.System.RecycleBinMedia, result.Result); + } + + [Test] + public void CanResolveContentRecycleBinKeyFromId() + { + var result = GetSubject().GetKeyForId(Constants.System.RecycleBinContent, UmbracoObjectTypes.Document); + Assert.IsTrue(result.Success); + Assert.AreEqual(Constants.System.RecycleBinContentKey, result.Result); + } + + [Test] + public void CanResolveMediaRecycleBinKeyFromId() + { + var result = GetSubject().GetKeyForId(Constants.System.RecycleBinMedia, UmbracoObjectTypes.Media); + Assert.IsTrue(result.Success); + Assert.AreEqual(Constants.System.RecycleBinMediaKey, result.Result); + } +}