From b6f1dd4e9d4a09bc95291bc1513bafe983baba20 Mon Sep 17 00:00:00 2001 From: Ronald Barendse Date: Fri, 31 Oct 2025 17:25:53 +0100 Subject: [PATCH 1/6] Add MemberType/MemberTypeContainer to supported EntityContainer object types --- src/Umbraco.Core/Models/EntityContainer.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Core/Models/EntityContainer.cs b/src/Umbraco.Core/Models/EntityContainer.cs index 6033c6dfa937..b6770913a67d 100644 --- a/src/Umbraco.Core/Models/EntityContainer.cs +++ b/src/Umbraco.Core/Models/EntityContainer.cs @@ -12,6 +12,7 @@ public sealed class EntityContainer : TreeEntityBase, IUmbracoEntity { Constants.ObjectTypes.DataType, Constants.ObjectTypes.DataTypeContainer }, { Constants.ObjectTypes.DocumentType, Constants.ObjectTypes.DocumentTypeContainer }, { Constants.ObjectTypes.MediaType, Constants.ObjectTypes.MediaTypeContainer }, + { Constants.ObjectTypes.MemberType, Constants.ObjectTypes.MemberTypeContainer }, { Constants.ObjectTypes.DocumentBlueprint, Constants.ObjectTypes.DocumentBlueprintContainer }, }; From b31ca8ab6ceca1372bda4a8906a22b2c8966fbd8 Mon Sep 17 00:00:00 2001 From: Ronald Barendse Date: Fri, 31 Oct 2025 17:26:21 +0100 Subject: [PATCH 2/6] Implement MemberTypeContainerRepository --- .../Implement/EntityContainerRepository.cs | 7 ++- .../MemberTypeContainerRepository.cs | 50 ++++++++----------- 2 files changed, 25 insertions(+), 32 deletions(-) diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/EntityContainerRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/EntityContainerRepository.cs index 9a4927b39ca6..7941ff1668b4 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/EntityContainerRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/EntityContainerRepository.cs @@ -32,8 +32,11 @@ public EntityContainerRepository( { Guid[] allowedContainers = { - Constants.ObjectTypes.DocumentTypeContainer, Constants.ObjectTypes.MediaTypeContainer, - Constants.ObjectTypes.DataTypeContainer, Constants.ObjectTypes.DocumentBlueprintContainer, + Constants.ObjectTypes.DataTypeContainer, + Constants.ObjectTypes.DocumentTypeContainer, + Constants.ObjectTypes.MediaTypeContainer, + Constants.ObjectTypes.MemberTypeContainer, + Constants.ObjectTypes.DocumentBlueprintContainer, }; NodeObjectTypeId = containerObjectType; if (allowedContainers.Contains(NodeObjectTypeId) == false) diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberTypeContainerRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberTypeContainerRepository.cs index 15c99d879b0a..9d8151d96407 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberTypeContainerRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberTypeContainerRepository.cs @@ -1,36 +1,26 @@ -using Umbraco.Cms.Core.Models; +using Microsoft.Extensions.Logging; +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Persistence.Repositories; +using Umbraco.Cms.Infrastructure.Scoping; -namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement +namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement; + +internal sealed class MemberTypeContainerRepository : EntityContainerRepository, IMemberTypeContainerRepository { - /// - /// A no-op implementation of , as containers aren't supported for members. - /// - /// - /// Introduced to avoid inconsistencies with nullability of dependencies for type repositories for content, media and members. - /// - internal sealed class MemberTypeContainerRepository : IMemberTypeContainerRepository + public MemberTypeContainerRepository( + IScopeAccessor scopeAccessor, + AppCaches cache, + ILogger logger, + IRepositoryCacheVersionService repositoryCacheVersionService, + ICacheSyncService cacheSyncService) + : base( + scopeAccessor, + cache, + logger, + Constants.ObjectTypes.MemberTypeContainer, + repositoryCacheVersionService, + cacheSyncService) { - public void Delete(EntityContainer entity) - { - } - - public bool Exists(int id) => false; - - public EntityContainer? Get(Guid id) => null; - - public IEnumerable Get(string name, int level) => Enumerable.Empty(); - - public bool HasDuplicateName(Guid parentKey, string name) => false; - - public bool HasDuplicateName(int parentId, string name) => false; - - public EntityContainer? Get(int id) => null; - - public IEnumerable GetMany(params int[]? ids) => Enumerable.Empty(); - - public void Save(EntityContainer entity) - { - } } } From ad213a23add5e511b1fba6580ca563156cd9c043 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Mon, 3 Nov 2025 12:20:31 +0100 Subject: [PATCH 3/6] Prepare base controller for MemberTypeTreeControllerBase. --- .../MemberType/Tree/MemberTypeTreeControllerBase.cs | 4 +++- .../ViewModels/Tree/MemberTypeTreeItemResponseModel.cs | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/MemberTypeTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/MemberTypeTreeControllerBase.cs index 6239b14988a1..1564a7d924b9 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/MemberTypeTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/MemberTypeTreeControllerBase.cs @@ -17,7 +17,7 @@ namespace Umbraco.Cms.Api.Management.Controllers.MemberType.Tree; [VersionedApiBackOfficeRoute($"{Constants.Web.RoutePath.Tree}/{Constants.UdiEntityType.MemberType}")] [ApiExplorerSettings(GroupName = "Member Type")] [Authorize(Policy = AuthorizationPolicies.TreeAccessMembersOrMemberTypes)] -public class MemberTypeTreeControllerBase : NamedEntityTreeControllerBase +public class MemberTypeTreeControllerBase : FolderTreeControllerBase { private readonly IMemberTypeService _memberTypeService; @@ -37,6 +37,8 @@ public MemberTypeTreeControllerBase(IEntityService entityService, FlagProviderCo protected override UmbracoObjectTypes ItemObjectType => UmbracoObjectTypes.MemberType; + protected override UmbracoObjectTypes FolderObjectType => UmbracoObjectTypes.MemberTypeContainer; + protected override MemberTypeTreeItemResponseModel[] MapTreeItemViewModels(Guid? parentKey, IEntitySlim[] entities) { var memberTypes = _memberTypeService diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Tree/MemberTypeTreeItemResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Tree/MemberTypeTreeItemResponseModel.cs index 04885b62ae76..67f7e35a99f8 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Tree/MemberTypeTreeItemResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Tree/MemberTypeTreeItemResponseModel.cs @@ -1,6 +1,6 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Tree; +namespace Umbraco.Cms.Api.Management.ViewModels.Tree; -public class MemberTypeTreeItemResponseModel : NamedEntityTreeItemResponseModel +public class MemberTypeTreeItemResponseModel : FolderTreeItemResponseModel { public string Icon { get; set; } = string.Empty; } From 6921a14f03da1c3be6aa3ea0d7d38cacb9a8cdba Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Mon, 3 Nov 2025 12:34:46 +0100 Subject: [PATCH 4/6] Revert "Prepare base controller for MemberTypeTreeControllerBase." This reverts commit ad213a23add5e511b1fba6580ca563156cd9c043. --- .../MemberType/Tree/MemberTypeTreeControllerBase.cs | 4 +--- .../ViewModels/Tree/MemberTypeTreeItemResponseModel.cs | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/MemberTypeTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/MemberTypeTreeControllerBase.cs index 1564a7d924b9..6239b14988a1 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/MemberTypeTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/MemberTypeTreeControllerBase.cs @@ -17,7 +17,7 @@ namespace Umbraco.Cms.Api.Management.Controllers.MemberType.Tree; [VersionedApiBackOfficeRoute($"{Constants.Web.RoutePath.Tree}/{Constants.UdiEntityType.MemberType}")] [ApiExplorerSettings(GroupName = "Member Type")] [Authorize(Policy = AuthorizationPolicies.TreeAccessMembersOrMemberTypes)] -public class MemberTypeTreeControllerBase : FolderTreeControllerBase +public class MemberTypeTreeControllerBase : NamedEntityTreeControllerBase { private readonly IMemberTypeService _memberTypeService; @@ -37,8 +37,6 @@ public MemberTypeTreeControllerBase(IEntityService entityService, FlagProviderCo protected override UmbracoObjectTypes ItemObjectType => UmbracoObjectTypes.MemberType; - protected override UmbracoObjectTypes FolderObjectType => UmbracoObjectTypes.MemberTypeContainer; - protected override MemberTypeTreeItemResponseModel[] MapTreeItemViewModels(Guid? parentKey, IEntitySlim[] entities) { var memberTypes = _memberTypeService diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Tree/MemberTypeTreeItemResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Tree/MemberTypeTreeItemResponseModel.cs index 67f7e35a99f8..04885b62ae76 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Tree/MemberTypeTreeItemResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Tree/MemberTypeTreeItemResponseModel.cs @@ -1,6 +1,6 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Tree; +namespace Umbraco.Cms.Api.Management.ViewModels.Tree; -public class MemberTypeTreeItemResponseModel : FolderTreeItemResponseModel +public class MemberTypeTreeItemResponseModel : NamedEntityTreeItemResponseModel { public string Icon { get; set; } = string.Empty; } From 4665f4d475f09ee9a2b0fe826f1beb7376964089 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Mon, 3 Nov 2025 14:57:22 +0100 Subject: [PATCH 5/6] Added foldersOnly flag in readiness for support in 17.1. --- .../MemberType/Tree/SiblingMemberTypeTreeController.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/SiblingMemberTypeTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/SiblingMemberTypeTreeController.cs index 4ed8e9f949e3..bda2fd3e2c60 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/SiblingMemberTypeTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/SiblingMemberTypeTreeController.cs @@ -1,4 +1,4 @@ -using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Common.ViewModels.Pagination; using Umbraco.Cms.Api.Management.Services.Flags; @@ -23,6 +23,7 @@ public async Task> CancellationToken cancellationToken, Guid target, int before, - int after) + int after, + bool foldersOnly = false) => await GetSiblings(target, before, after); } From d555bc7f89fe2cd80904f974bdf3502c498393aa Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Mon, 3 Nov 2025 14:58:20 +0100 Subject: [PATCH 6/6] Added foldersOnly flag in readiness for support in 17.1 (2). --- .../MemberType/Tree/RootMemberTypeTreeController.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/RootMemberTypeTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/RootMemberTypeTreeController.cs index 2b4e89e17595..1d8127f6aaea 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/RootMemberTypeTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/RootMemberTypeTreeController.cs @@ -30,6 +30,7 @@ public RootMemberTypeTreeController(IEntityService entityService, FlagProviderCo public async Task>> Root( CancellationToken cancellationToken, int skip = 0, - int take = 100) + int take = 100, + bool foldersOnly = false) => await GetRoot(skip, take); }