diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MediaType/MediaTypeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/MediaType/MediaTypeControllerBase.cs index 387d260cde62..f1f20a68c824 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MediaType/MediaTypeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MediaType/MediaTypeControllerBase.cs @@ -31,7 +31,7 @@ protected IActionResult MediaTypeImportOperationStatusResult(MediaTypeImportOper .WithDetail("The import failed due to not being able to convert the file into proper xml.") .Build()), MediaTypeImportOperationStatus.MediaTypeExists => BadRequest(problemDetailsBuilder - .WithTitle("Failed to import because media type exits") + .WithTitle("Failed to import because media type exists") .WithDetail("The import failed because the media type that was being imported already exits.") .Build()), MediaTypeImportOperationStatus.TypeMismatch => BadRequest(problemDetailsBuilder @@ -42,6 +42,6 @@ protected IActionResult MediaTypeImportOperationStatusResult(MediaTypeImportOper .WithTitle("Invalid Id") .WithDetail("The import failed because the id of the media type you are trying to update did not match the id in the file.") .Build()), - _ => StatusCode(StatusCodes.Status500InternalServerError, "Unknown media type import operation status.") + _ => StatusCode(StatusCodes.Status500InternalServerError, "Unknown media type import operation status."), }); } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/CopyMemberTypeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/CopyMemberTypeController.cs index e0d24d0973c7..6a24374cc2b0 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/CopyMemberTypeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/CopyMemberTypeController.cs @@ -1,7 +1,10 @@ -using Asp.Versioning; +using Asp.Versioning; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Umbraco.Cms.Api.Management.Controllers.MediaType; +using Umbraco.Cms.Api.Management.ViewModels.MediaType; +using Umbraco.Cms.Api.Management.ViewModels.MemberType; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services; @@ -24,9 +27,12 @@ public CopyMemberTypeController(IMemberTypeService memberTypeService) [ProducesResponseType(StatusCodes.Status201Created)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] - public async Task Copy(CancellationToken cancellationToken, Guid id) + public async Task Copy( + CancellationToken cancellationToken, + Guid id, + CopyMemberTypeRequestModel copyMemberTypeRequestModel) { - Attempt result = await _memberTypeService.CopyAsync(id, containerKey: null); + Attempt result = await _memberTypeService.CopyAsync(id, copyMemberTypeRequestModel.Target?.Id); return result.Success ? CreatedAtId(controller => nameof(controller.ByKey), result.Result!.Key) diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/ExportMemberTypeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/ExportMemberTypeController.cs new file mode 100644 index 000000000000..e007f7effb85 --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/ExportMemberTypeController.cs @@ -0,0 +1,44 @@ +using Asp.Versioning; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Umbraco.Cms.Api.Management.Factories; +using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Core.Services.OperationStatus; +using Umbraco.Cms.Web.Common.Authorization; + +namespace Umbraco.Cms.Api.Management.Controllers.MemberType; + +[ApiVersion("1.0")] +[Authorize(Policy = AuthorizationPolicies.TreeAccessMemberTypes)] +public class ExportMemberTypeController : MemberTypeControllerBase +{ + private readonly IMemberTypeService _memberTypeService; + private readonly IUdtFileContentFactory _fileContentFactory; + + public ExportMemberTypeController( + IMemberTypeService memberTypeService, + IUdtFileContentFactory fileContentFactory) + { + _memberTypeService = memberTypeService; + _fileContentFactory = fileContentFactory; + } + + [HttpGet("{id:guid}/export")] + [MapToApiVersion("1.0")] + [ProducesResponseType(typeof(FileContentResult), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] + public IActionResult Export( + CancellationToken cancellationToken, + Guid id) + { + IMemberType? memberType = _memberTypeService.Get(id); + if (memberType is null) + { + return OperationStatusResult(ContentTypeOperationStatus.NotFound); + } + + return _fileContentFactory.Create(memberType); + } +} diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/ImportExistingMemberTypeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/ImportExistingMemberTypeController.cs new file mode 100644 index 000000000000..48d43aaeb0fa --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/ImportExistingMemberTypeController.cs @@ -0,0 +1,46 @@ +using Asp.Versioning; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Umbraco.Cms.Api.Management.ViewModels.MemberType; +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Security; +using Umbraco.Cms.Core.Services.ImportExport; +using Umbraco.Cms.Core.Services.OperationStatus; +using Umbraco.Cms.Web.Common.Authorization; + +namespace Umbraco.Cms.Api.Management.Controllers.MemberType; + +[ApiVersion("1.0")] +[Authorize(Policy = AuthorizationPolicies.TreeAccessMemberTypes)] +public class ImportExistingMemberTypeController : MemberTypeControllerBase +{ + private readonly IBackOfficeSecurityAccessor _backOfficeSecurityAccessor; + private readonly IMemberTypeImportService _memberTypeImportService; + + public ImportExistingMemberTypeController( + IBackOfficeSecurityAccessor backOfficeSecurityAccessor, + IMemberTypeImportService memberTypeImportService) + { + _backOfficeSecurityAccessor = backOfficeSecurityAccessor; + _memberTypeImportService = memberTypeImportService; + } + + [HttpPut("{id:guid}/import")] + [MapToApiVersion("1.0")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] + public async Task Import( + CancellationToken cancellationToken, + Guid id, + ImportMemberTypeRequestModel model) + { + Attempt importAttempt = await _memberTypeImportService.Import(model.File.Id, CurrentUserKey(_backOfficeSecurityAccessor)); + + return importAttempt.Success is false + ? MemberTypeImportOperationStatusResult(importAttempt.Status) + : Ok(); + } +} diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/ImportNewMemberTypeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/ImportNewMemberTypeController.cs new file mode 100644 index 000000000000..f10cf8a8bf7d --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/ImportNewMemberTypeController.cs @@ -0,0 +1,45 @@ +using Asp.Versioning; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Umbraco.Cms.Api.Management.ViewModels.MemberType; +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Security; +using Umbraco.Cms.Core.Services.ImportExport; +using Umbraco.Cms.Core.Services.OperationStatus; +using Umbraco.Cms.Web.Common.Authorization; + +namespace Umbraco.Cms.Api.Management.Controllers.MemberType; + +[ApiVersion("1.0")] +[Authorize(Policy = AuthorizationPolicies.TreeAccessMemberTypes)] +public class ImportNewMemberTypeController : MemberTypeControllerBase +{ + private readonly IBackOfficeSecurityAccessor _backOfficeSecurityAccessor; + private readonly IMemberTypeImportService _memberTypeImportService; + + public ImportNewMemberTypeController( + IBackOfficeSecurityAccessor backOfficeSecurityAccessor, + IMemberTypeImportService memberTypeImportService) + { + _backOfficeSecurityAccessor = backOfficeSecurityAccessor; + _memberTypeImportService = memberTypeImportService; + } + + [HttpPost("import")] + [MapToApiVersion("1.0")] + [ProducesResponseType(StatusCodes.Status201Created)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] + public async Task Import( + CancellationToken cancellationToken, + ImportMemberTypeRequestModel model) + { + Attempt importAttempt = await _memberTypeImportService.Import(model.File.Id, CurrentUserKey(_backOfficeSecurityAccessor)); + + return importAttempt.Success is false + ? MemberTypeImportOperationStatusResult(importAttempt.Status) + : CreatedAtId(controller => nameof(controller.ByKey), importAttempt.Result!.Key); + } +} diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/MemberTypeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/MemberTypeControllerBase.cs index 7b4395382d7b..3de7fad8d924 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/MemberTypeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/MemberTypeControllerBase.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Management.Controllers.DocumentType; using Umbraco.Cms.Api.Management.Routing; @@ -18,4 +19,29 @@ protected IActionResult OperationStatusResult(ContentTypeOperationStatus status) protected IActionResult StructureOperationStatusResult(ContentTypeStructureOperationStatus status) => DocumentTypeControllerBase.ContentTypeStructureOperationStatusResult(status, "member"); + + protected IActionResult MemberTypeImportOperationStatusResult(MemberTypeImportOperationStatus operationStatus) => + OperationStatusResult(operationStatus, problemDetailsBuilder => operationStatus switch + { + MemberTypeImportOperationStatus.TemporaryFileNotFound => NotFound(problemDetailsBuilder + .WithTitle("Temporary file not found") + .Build()), + MemberTypeImportOperationStatus.TemporaryFileConversionFailure => BadRequest(problemDetailsBuilder + .WithTitle("Failed to convert the specified file") + .WithDetail("The import failed due to not being able to convert the file into proper xml.") + .Build()), + MemberTypeImportOperationStatus.MemberTypeExists => BadRequest(problemDetailsBuilder + .WithTitle("Failed to import because member type exists") + .WithDetail("The import failed because the member type that was being imported already exits.") + .Build()), + MemberTypeImportOperationStatus.TypeMismatch => BadRequest(problemDetailsBuilder + .WithTitle("Type Mismatch") + .WithDetail("The import failed because the file contained an entity that is not a member type.") + .Build()), + MemberTypeImportOperationStatus.IdMismatch => BadRequest(problemDetailsBuilder + .WithTitle("Invalid Id") + .WithDetail("The import failed because the id of the member type you are trying to update did not match the id in the file.") + .Build()), + _ => StatusCode(StatusCodes.Status500InternalServerError, "Unknown member type import operation status."), + }); } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/MoveMemberTypeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/MoveMemberTypeController.cs new file mode 100644 index 000000000000..57ef59f14857 --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/MoveMemberTypeController.cs @@ -0,0 +1,39 @@ +using Asp.Versioning; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Umbraco.Cms.Api.Management.ViewModels.MemberType; +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Core.Services.OperationStatus; +using Umbraco.Cms.Web.Common.Authorization; + +namespace Umbraco.Cms.Api.Management.Controllers.MemberType; + +[ApiVersion("1.0")] +[Authorize(Policy = AuthorizationPolicies.TreeAccessMemberTypes)] +public class MoveMemberTypeController : MemberTypeControllerBase +{ + private readonly IMemberTypeService _memberTypeService; + + public MoveMemberTypeController(IMemberTypeService memberTypeService) + => _memberTypeService = memberTypeService; + + [HttpPut("{id:guid}/move")] + [MapToApiVersion("1.0")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] + public async Task Move( + CancellationToken cancellationToken, + Guid id, + MoveMemberTypeRequestModel moveMemberTypeRequestModel) + { + Attempt result = await _memberTypeService.MoveAsync(id, moveMemberTypeRequestModel.Target?.Id); + + return result.Success + ? Ok() + : StructureOperationStatusResult(result.Status); + } +} diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/AncestorsMemberTypeTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/AncestorsMemberTypeTreeController.cs new file mode 100644 index 000000000000..35be66ecbacc --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/AncestorsMemberTypeTreeController.cs @@ -0,0 +1,23 @@ +using Asp.Versioning; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Umbraco.Cms.Api.Management.Services.Flags; +using Umbraco.Cms.Api.Management.ViewModels.Tree; +using Umbraco.Cms.Core.Services; + +namespace Umbraco.Cms.Api.Management.Controllers.MemberType.Tree; + +[ApiVersion("1.0")] +public class AncestorsMemberTypeTreeController : MemberTypeTreeControllerBase +{ + public AncestorsMemberTypeTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IMemberTypeService memberTypeService) + : base(entityService, flagProviders, memberTypeService) + { + } + + [HttpGet("ancestors")] + [MapToApiVersion("1.0")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> Ancestors(CancellationToken cancellationToken, Guid descendantId) + => await GetAncestors(descendantId); +} diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/ChildrenMemberTypeTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/ChildrenMemberTypeTreeController.cs new file mode 100644 index 000000000000..b1d6bb090e23 --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/ChildrenMemberTypeTreeController.cs @@ -0,0 +1,31 @@ +using Asp.Versioning; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Umbraco.Cms.Api.Common.ViewModels.Pagination; +using Umbraco.Cms.Api.Management.Services.Flags; +using Umbraco.Cms.Api.Management.ViewModels.Tree; +using Umbraco.Cms.Core.Services; + +namespace Umbraco.Cms.Api.Management.Controllers.MemberType.Tree; + +[ApiVersion("1.0")] +public class ChildrenMemberTypeTreeController : MemberTypeTreeControllerBase +{ + public ChildrenMemberTypeTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IMemberTypeService memberTypeService) + : base(entityService, flagProviders, memberTypeService) + { } + + [HttpGet("children")] + [MapToApiVersion("1.0")] + [ProducesResponseType(typeof(PagedViewModel), StatusCodes.Status200OK)] + public async Task>> Children( + CancellationToken cancellationToken, + Guid parentId, + int skip = 0, + int take = 100, + bool foldersOnly = false) + { + RenderFoldersOnly(foldersOnly); + return await GetChildren(parentId, skip, take); + } +} 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/Controllers/MemberType/Tree/RootMemberTypeTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/RootMemberTypeTreeController.cs index 1d8127f6aaea..145b790a3201 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/RootMemberTypeTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/RootMemberTypeTreeController.cs @@ -32,5 +32,8 @@ public async Task>> int skip = 0, int take = 100, bool foldersOnly = false) - => await GetRoot(skip, take); + { + RenderFoldersOnly(foldersOnly); + return await GetRoot(skip, take); + } } 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 bda2fd3e2c60..c2e6f4ad74e8 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/SiblingMemberTypeTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/SiblingMemberTypeTreeController.cs @@ -25,5 +25,8 @@ public async Task> int before, int after, bool foldersOnly = false) - => await GetSiblings(target, before, after); + { + RenderFoldersOnly(foldersOnly); + return await GetSiblings(target, before, after); + } } diff --git a/src/Umbraco.Cms.Api.Management/Factories/IUdtFileContentFactory.cs b/src/Umbraco.Cms.Api.Management/Factories/IUdtFileContentFactory.cs index fa8aacf438d4..5ff87485daf9 100644 --- a/src/Umbraco.Cms.Api.Management/Factories/IUdtFileContentFactory.cs +++ b/src/Umbraco.Cms.Api.Management/Factories/IUdtFileContentFactory.cs @@ -8,4 +8,6 @@ public interface IUdtFileContentFactory FileContentResult Create(IContentType contentType); FileContentResult Create(IMediaType mediaType); + + FileContentResult Create(IMemberType mediaType) => throw new NotImplementedException(); } diff --git a/src/Umbraco.Cms.Api.Management/Factories/MemberTypeEditingPresentationFactory.cs b/src/Umbraco.Cms.Api.Management/Factories/MemberTypeEditingPresentationFactory.cs index 77ef1274670d..cb9d3279eee7 100644 --- a/src/Umbraco.Cms.Api.Management/Factories/MemberTypeEditingPresentationFactory.cs +++ b/src/Umbraco.Cms.Api.Management/Factories/MemberTypeEditingPresentationFactory.cs @@ -1,4 +1,4 @@ -using Umbraco.Cms.Api.Management.ViewModels.MemberType; +using Umbraco.Cms.Api.Management.ViewModels.MemberType; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.ContentTypeEditing; using Umbraco.Cms.Core.Services; @@ -24,6 +24,7 @@ public MemberTypeCreateModel MapCreateModel(CreateMemberTypeRequestModel request createModel.Key = requestModel.Id; createModel.Compositions = MapCompositions(requestModel.Compositions); + createModel.ContainerKey = requestModel.Parent?.Id; MapPropertyTypeSensitivityAndVisibility(createModel.Properties, requestModel.Properties); diff --git a/src/Umbraco.Cms.Api.Management/Factories/UdtFileContentFactory.cs b/src/Umbraco.Cms.Api.Management/Factories/UdtFileContentFactory.cs index 5b55e6b13a50..d801a8ee44f7 100644 --- a/src/Umbraco.Cms.Api.Management/Factories/UdtFileContentFactory.cs +++ b/src/Umbraco.Cms.Api.Management/Factories/UdtFileContentFactory.cs @@ -27,6 +27,12 @@ public FileContentResult Create(IMediaType mediaType) return XmlTofile(mediaType, xml); } + public FileContentResult Create(IMemberType memberType) + { + XElement xml = _entityXmlSerializer.Serialize(memberType); + return XmlTofile(memberType, xml); + } + private static FileContentResult XmlTofile(IContentTypeBase contentTypeBase, XElement xml) => new(Encoding.UTF8.GetBytes(xml.ToDataString()), MediaTypeNames.Application.Octet) { diff --git a/src/Umbraco.Cms.Api.Management/OpenApi.json b/src/Umbraco.Cms.Api.Management/OpenApi.json index 8600277831a6..6a610632ce45 100644 --- a/src/Umbraco.Cms.Api.Management/OpenApi.json +++ b/src/Umbraco.Cms.Api.Management/OpenApi.json @@ -11898,6 +11898,95 @@ ] } }, + "/umbraco/management/api/v1/help": { + "get": { + "tags": [ + "Help" + ], + "operationId": "GetHelp", + "parameters": [ + { + "name": "section", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "tree", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "skip", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 0 + } + }, + { + "name": "take", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 100 + } + }, + { + "name": "baseUrl", + "in": "query", + "schema": { + "type": "string", + "default": "https://our.umbraco.com" + } + } + ], + "responses": { + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/ProblemDetails" + } + ] + } + } + } + }, + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/PagedHelpPageResponseModel" + } + ] + } + } + } + }, + "401": { + "description": "The resource is protected and requires an authentication token" + } + }, + "deprecated": true, + "security": [ + { + "Backoffice-User": [ ] + } + ] + } + }, "/umbraco/management/api/v1/imaging/resize/urls": { "get": { "tags": [ @@ -19996,6 +20085,37 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/CopyMemberTypeRequestModel" + } + ] + } + }, + "text/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/CopyMemberTypeRequestModel" + } + ] + } + }, + "application/*+json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/CopyMemberTypeRequestModel" + } + ] + } + } + } + }, "responses": { "201": { "description": "Created", @@ -20105,114 +20225,47 @@ ] } }, - "/umbraco/management/api/v1/member-type/available-compositions": { - "post": { + "/umbraco/management/api/v1/member-type/{id}/export": { + "get": { "tags": [ "Member Type" ], - "operationId": "PostMemberTypeAvailableCompositions", - "requestBody": { - "content": { - "application/json": { - "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/MemberTypeCompositionRequestModel" - } - ] - } - }, - "text/json": { - "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/MemberTypeCompositionRequestModel" - } - ] - } - }, - "application/*+json": { - "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/MemberTypeCompositionRequestModel" - } - ] - } + "operationId": "GetMemberTypeByIdExport", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } - }, + ], "responses": { "200": { "description": "OK", - "headers": { - "Umb-Notifications": { - "description": "The list of notifications produced during the request.", - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NotificationHeaderModel" - }, - "nullable": true - } - } - }, "content": { "application/json": { "schema": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/AvailableMemberTypeCompositionResponseModel" - } - ] - } + "oneOf": [ + { + "type": "string", + "format": "binary" + } + ] } } } }, - "401": { - "description": "The resource is protected and requires an authentication token" - }, - "403": { - "description": "The authenticated user does not have access to this resource", - "headers": { - "Umb-Notifications": { - "description": "The list of notifications produced during the request.", - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NotificationHeaderModel" - }, - "nullable": true - } - } - } - } - }, - "security": [ - { - "Backoffice-User": [ ] - } - ] - } - }, - "/umbraco/management/api/v1/member-type/configuration": { - "get": { - "tags": [ - "Member Type" - ], - "operationId": "GetMemberTypeConfiguration", - "responses": { - "200": { - "description": "OK", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { "oneOf": [ { - "$ref": "#/components/schemas/MemberTypeConfigurationResponseModel" + "$ref": "#/components/schemas/ProblemDetails" } ] } @@ -20233,19 +20286,30 @@ ] } }, - "/umbraco/management/api/v1/member-type/folder": { - "post": { + "/umbraco/management/api/v1/member-type/{id}/import": { + "put": { "tags": [ "Member Type" ], - "operationId": "PostMemberTypeFolder", + "operationId": "PutMemberTypeByIdImport", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "requestBody": { "content": { "application/json": { "schema": { "oneOf": [ { - "$ref": "#/components/schemas/CreateFolderRequestModel" + "$ref": "#/components/schemas/ImportMemberTypeRequestModel" } ] } @@ -20254,7 +20318,7 @@ "schema": { "oneOf": [ { - "$ref": "#/components/schemas/CreateFolderRequestModel" + "$ref": "#/components/schemas/ImportMemberTypeRequestModel" } ] } @@ -20263,7 +20327,7 @@ "schema": { "oneOf": [ { - "$ref": "#/components/schemas/CreateFolderRequestModel" + "$ref": "#/components/schemas/ImportMemberTypeRequestModel" } ] } @@ -20271,24 +20335,9 @@ } }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "headers": { - "Umb-Generated-Resource": { - "description": "Identifier of the newly created resource", - "schema": { - "type": "string", - "description": "Identifier of the newly created resource" - } - }, - "Location": { - "description": "Location of the newly created resource", - "schema": { - "type": "string", - "description": "Location of the newly created resource", - "format": "uri" - } - }, "Umb-Notifications": { "description": "The list of notifications produced during the request.", "schema": { @@ -20301,9 +20350,425 @@ } } }, - "400": { - "description": "Bad Request", - "headers": { + "404": { + "description": "Not Found", + "headers": { + "Umb-Notifications": { + "description": "The list of notifications produced during the request.", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationHeaderModel" + }, + "nullable": true + } + } + }, + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/ProblemDetails" + } + ] + } + } + } + }, + "400": { + "description": "Bad Request", + "headers": { + "Umb-Notifications": { + "description": "The list of notifications produced during the request.", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationHeaderModel" + }, + "nullable": true + } + } + }, + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/ProblemDetails" + } + ] + } + } + } + }, + "401": { + "description": "The resource is protected and requires an authentication token" + }, + "403": { + "description": "The authenticated user does not have access to this resource", + "headers": { + "Umb-Notifications": { + "description": "The list of notifications produced during the request.", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationHeaderModel" + }, + "nullable": true + } + } + } + } + }, + "security": [ + { + "Backoffice-User": [ ] + } + ] + } + }, + "/umbraco/management/api/v1/member-type/{id}/move": { + "put": { + "tags": [ + "Member Type" + ], + "operationId": "PutMemberTypeByIdMove", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/MoveMemberTypeRequestModel" + } + ] + } + }, + "text/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/MoveMemberTypeRequestModel" + } + ] + } + }, + "application/*+json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/MoveMemberTypeRequestModel" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "headers": { + "Umb-Notifications": { + "description": "The list of notifications produced during the request.", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationHeaderModel" + }, + "nullable": true + } + } + } + }, + "400": { + "description": "Bad Request", + "headers": { + "Umb-Notifications": { + "description": "The list of notifications produced during the request.", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationHeaderModel" + }, + "nullable": true + } + } + }, + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/ProblemDetails" + } + ] + } + } + } + }, + "404": { + "description": "Not Found", + "headers": { + "Umb-Notifications": { + "description": "The list of notifications produced during the request.", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationHeaderModel" + }, + "nullable": true + } + } + }, + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/ProblemDetails" + } + ] + } + } + } + }, + "401": { + "description": "The resource is protected and requires an authentication token" + }, + "403": { + "description": "The authenticated user does not have access to this resource", + "headers": { + "Umb-Notifications": { + "description": "The list of notifications produced during the request.", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationHeaderModel" + }, + "nullable": true + } + } + } + } + }, + "security": [ + { + "Backoffice-User": [ ] + } + ] + } + }, + "/umbraco/management/api/v1/member-type/available-compositions": { + "post": { + "tags": [ + "Member Type" + ], + "operationId": "PostMemberTypeAvailableCompositions", + "requestBody": { + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/MemberTypeCompositionRequestModel" + } + ] + } + }, + "text/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/MemberTypeCompositionRequestModel" + } + ] + } + }, + "application/*+json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/MemberTypeCompositionRequestModel" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "headers": { + "Umb-Notifications": { + "description": "The list of notifications produced during the request.", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationHeaderModel" + }, + "nullable": true + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/AvailableMemberTypeCompositionResponseModel" + } + ] + } + } + } + } + }, + "401": { + "description": "The resource is protected and requires an authentication token" + }, + "403": { + "description": "The authenticated user does not have access to this resource", + "headers": { + "Umb-Notifications": { + "description": "The list of notifications produced during the request.", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationHeaderModel" + }, + "nullable": true + } + } + } + } + }, + "security": [ + { + "Backoffice-User": [ ] + } + ] + } + }, + "/umbraco/management/api/v1/member-type/configuration": { + "get": { + "tags": [ + "Member Type" + ], + "operationId": "GetMemberTypeConfiguration", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/MemberTypeConfigurationResponseModel" + } + ] + } + } + } + }, + "401": { + "description": "The resource is protected and requires an authentication token" + }, + "403": { + "description": "The authenticated user does not have access to this resource" + } + }, + "security": [ + { + "Backoffice-User": [ ] + } + ] + } + }, + "/umbraco/management/api/v1/member-type/folder": { + "post": { + "tags": [ + "Member Type" + ], + "operationId": "PostMemberTypeFolder", + "requestBody": { + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/CreateFolderRequestModel" + } + ] + } + }, + "text/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/CreateFolderRequestModel" + } + ] + } + }, + "application/*+json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/CreateFolderRequestModel" + } + ] + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "headers": { + "Umb-Generated-Resource": { + "description": "Identifier of the newly created resource", + "schema": { + "type": "string", + "description": "Identifier of the newly created resource" + } + }, + "Location": { + "description": "Location of the newly created resource", + "schema": { + "type": "string", + "description": "Location of the newly created resource", + "format": "uri" + } + }, + "Umb-Notifications": { + "description": "The list of notifications produced during the request.", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationHeaderModel" + }, + "nullable": true + } + } + } + }, + "400": { + "description": "Bad Request", + "headers": { "Umb-Notifications": { "description": "The list of notifications produced during the request.", "schema": { @@ -20453,7 +20918,147 @@ "format": "uuid" } } - ], + ], + "responses": { + "200": { + "description": "OK", + "headers": { + "Umb-Notifications": { + "description": "The list of notifications produced during the request.", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationHeaderModel" + }, + "nullable": true + } + } + } + }, + "400": { + "description": "Bad Request", + "headers": { + "Umb-Notifications": { + "description": "The list of notifications produced during the request.", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationHeaderModel" + }, + "nullable": true + } + } + }, + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/ProblemDetails" + } + ] + } + } + } + }, + "404": { + "description": "Not Found", + "headers": { + "Umb-Notifications": { + "description": "The list of notifications produced during the request.", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationHeaderModel" + }, + "nullable": true + } + } + }, + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/ProblemDetails" + } + ] + } + } + } + }, + "401": { + "description": "The resource is protected and requires an authentication token" + }, + "403": { + "description": "The authenticated user does not have access to this resource", + "headers": { + "Umb-Notifications": { + "description": "The list of notifications produced during the request.", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationHeaderModel" + }, + "nullable": true + } + } + } + } + }, + "security": [ + { + "Backoffice-User": [ ] + } + ] + }, + "put": { + "tags": [ + "Member Type" + ], + "operationId": "PutMemberTypeFolderById", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/UpdateFolderResponseModel" + } + ] + } + }, + "text/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/UpdateFolderResponseModel" + } + ] + } + }, + "application/*+json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/UpdateFolderResponseModel" + } + ] + } + } + } + }, "responses": { "200": { "description": "OK", @@ -20546,30 +21151,21 @@ "Backoffice-User": [ ] } ] - }, - "put": { + } + }, + "/umbraco/management/api/v1/member-type/import": { + "post": { "tags": [ "Member Type" ], - "operationId": "PutMemberTypeFolderById", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "operationId": "PostMemberTypeImport", "requestBody": { "content": { "application/json": { "schema": { "oneOf": [ { - "$ref": "#/components/schemas/UpdateFolderResponseModel" + "$ref": "#/components/schemas/ImportMemberTypeRequestModel" } ] } @@ -20578,7 +21174,7 @@ "schema": { "oneOf": [ { - "$ref": "#/components/schemas/UpdateFolderResponseModel" + "$ref": "#/components/schemas/ImportMemberTypeRequestModel" } ] } @@ -20587,7 +21183,7 @@ "schema": { "oneOf": [ { - "$ref": "#/components/schemas/UpdateFolderResponseModel" + "$ref": "#/components/schemas/ImportMemberTypeRequestModel" } ] } @@ -20595,9 +21191,24 @@ } }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "headers": { + "Umb-Generated-Resource": { + "description": "Identifier of the newly created resource", + "schema": { + "type": "string", + "description": "Identifier of the newly created resource" + } + }, + "Location": { + "description": "Location of the newly created resource", + "schema": { + "type": "string", + "description": "Location of the newly created resource", + "format": "uri" + } + }, "Umb-Notifications": { "description": "The list of notifications produced during the request.", "schema": { @@ -20610,8 +21221,8 @@ } } }, - "400": { - "description": "Bad Request", + "404": { + "description": "Not Found", "headers": { "Umb-Notifications": { "description": "The list of notifications produced during the request.", @@ -20636,8 +21247,8 @@ } } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "headers": { "Umb-Notifications": { "description": "The list of notifications produced during the request.", @@ -20688,6 +21299,125 @@ ] } }, + "/umbraco/management/api/v1/tree/member-type/ancestors": { + "get": { + "tags": [ + "Member Type" + ], + "operationId": "GetTreeMemberTypeAncestors", + "parameters": [ + { + "name": "descendantId", + "in": "query", + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/MemberTypeTreeItemResponseModel" + } + ] + } + } + } + } + }, + "401": { + "description": "The resource is protected and requires an authentication token" + }, + "403": { + "description": "The authenticated user does not have access to this resource" + } + }, + "security": [ + { + "Backoffice-User": [ ] + } + ] + } + }, + "/umbraco/management/api/v1/tree/member-type/children": { + "get": { + "tags": [ + "Member Type" + ], + "operationId": "GetTreeMemberTypeChildren", + "parameters": [ + { + "name": "parentId", + "in": "query", + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "skip", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 0 + } + }, + { + "name": "take", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 100 + } + }, + { + "name": "foldersOnly", + "in": "query", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/PagedMemberTypeTreeItemResponseModel" + } + ] + } + } + } + }, + "401": { + "description": "The resource is protected and requires an authentication token" + }, + "403": { + "description": "The authenticated user does not have access to this resource" + } + }, + "security": [ + { + "Backoffice-User": [ ] + } + ] + } + }, "/umbraco/management/api/v1/tree/member-type/root": { "get": { "tags": [ @@ -20712,6 +21442,14 @@ "format": "int32", "default": 100 } + }, + { + "name": "foldersOnly", + "in": "query", + "schema": { + "type": "boolean", + "default": false + } } ], "responses": { @@ -20773,6 +21511,14 @@ "type": "integer", "format": "int32" } + }, + { + "name": "foldersOnly", + "in": "query", + "schema": { + "type": "boolean", + "default": false + } } ], "responses": { @@ -36266,6 +37012,20 @@ }, "additionalProperties": false }, + "CopyMemberTypeRequestModel": { + "type": "object", + "properties": { + "target": { + "oneOf": [ + { + "$ref": "#/components/schemas/ReferenceByIdModel" + } + ], + "nullable": true + } + }, + "additionalProperties": false + }, "CreateDataTypeRequestModel": { "required": [ "editorAlias", @@ -37361,6 +38121,14 @@ "format": "uuid", "nullable": true }, + "parent": { + "oneOf": [ + { + "$ref": "#/components/schemas/ReferenceByIdModel" + } + ], + "nullable": true + }, "compositions": { "type": "array", "items": { @@ -40824,6 +41592,22 @@ }, "additionalProperties": false }, + "ImportMemberTypeRequestModel": { + "required": [ + "file" + ], + "type": "object", + "properties": { + "file": { + "oneOf": [ + { + "$ref": "#/components/schemas/ReferenceByIdModel" + } + ] + } + }, + "additionalProperties": false + }, "IndexResponseModel": { "required": [ "canRebuild", @@ -42852,6 +43636,7 @@ "hasChildren", "icon", "id", + "isFolder", "name" ], "type": "object", @@ -42884,6 +43669,9 @@ "name": { "type": "string" }, + "isFolder": { + "type": "boolean" + }, "icon": { "type": "string" } @@ -43129,6 +43917,20 @@ }, "additionalProperties": false }, + "MoveMemberTypeRequestModel": { + "type": "object", + "properties": { + "target": { + "oneOf": [ + { + "$ref": "#/components/schemas/ReferenceByIdModel" + } + ], + "nullable": true + } + }, + "additionalProperties": false + }, "NamedEntityTreeItemResponseModel": { "required": [ "flags", diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/MemberType/CopyMemberTypeRequestModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/MemberType/CopyMemberTypeRequestModel.cs new file mode 100644 index 000000000000..f5835bfab899 --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/ViewModels/MemberType/CopyMemberTypeRequestModel.cs @@ -0,0 +1,6 @@ +namespace Umbraco.Cms.Api.Management.ViewModels.MemberType; + +public class CopyMemberTypeRequestModel +{ + public ReferenceByIdModel? Target { get; set; } +} diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/MemberType/CreateMemberTypeRequestModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/MemberType/CreateMemberTypeRequestModel.cs index 020d4af05d5f..4bf111a4f858 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/MemberType/CreateMemberTypeRequestModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/MemberType/CreateMemberTypeRequestModel.cs @@ -1,9 +1,9 @@ -using Umbraco.Cms.Api.Management.ViewModels.ContentType; +using Umbraco.Cms.Api.Management.ViewModels.ContentType; namespace Umbraco.Cms.Api.Management.ViewModels.MemberType; public class CreateMemberTypeRequestModel - : CreateContentTypeRequestModelBase + : CreateContentTypeWithParentRequestModelBase { public IEnumerable Compositions { get; set; } = Enumerable.Empty(); } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/MemberType/ImportMemberTypeRequestModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/MemberType/ImportMemberTypeRequestModel.cs new file mode 100644 index 000000000000..4f8052297fb1 --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/ViewModels/MemberType/ImportMemberTypeRequestModel.cs @@ -0,0 +1,6 @@ +namespace Umbraco.Cms.Api.Management.ViewModels.MemberType; + +public class ImportMemberTypeRequestModel +{ + public required ReferenceByIdModel File { get; set; } +} diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/MemberType/MoveMemberTypeRequestModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/MemberType/MoveMemberTypeRequestModel.cs new file mode 100644 index 000000000000..73136ca57454 --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/ViewModels/MemberType/MoveMemberTypeRequestModel.cs @@ -0,0 +1,6 @@ +namespace Umbraco.Cms.Api.Management.ViewModels.MemberType; + +public class MoveMemberTypeRequestModel +{ + public ReferenceByIdModel? Target { get; set; } +} 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; } diff --git a/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs b/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs index 28f91d45707f..90d895f2af31 100644 --- a/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs +++ b/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs @@ -430,6 +430,7 @@ private void AddCoreServices() Services.AddUnique(); Services.AddUnique(); Services.AddUnique(); + Services.AddUnique(); // add validation services Services.AddUnique(); diff --git a/src/Umbraco.Core/Models/ContentTypeEditing/MemberTypeCreateModel.cs b/src/Umbraco.Core/Models/ContentTypeEditing/MemberTypeCreateModel.cs index 4193002a1932..a327cc5fe0ef 100644 --- a/src/Umbraco.Core/Models/ContentTypeEditing/MemberTypeCreateModel.cs +++ b/src/Umbraco.Core/Models/ContentTypeEditing/MemberTypeCreateModel.cs @@ -1,6 +1,8 @@ -namespace Umbraco.Cms.Core.Models.ContentTypeEditing; +namespace Umbraco.Cms.Core.Models.ContentTypeEditing; public class MemberTypeCreateModel : MemberTypeModelBase { public Guid? Key { get; set; } + + public Guid? ContainerKey { get; set; } } diff --git a/src/Umbraco.Core/Services/ContentTypeEditing/IMemberTypeEditingService.cs b/src/Umbraco.Core/Services/ContentTypeEditing/IMemberTypeEditingService.cs index 9960e3baafe6..9309e4c45a8e 100644 --- a/src/Umbraco.Core/Services/ContentTypeEditing/IMemberTypeEditingService.cs +++ b/src/Umbraco.Core/Services/ContentTypeEditing/IMemberTypeEditingService.cs @@ -1,4 +1,4 @@ -using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.ContentTypeEditing; using Umbraco.Cms.Core.Services.OperationStatus; diff --git a/src/Umbraco.Core/Services/ContentTypeEditing/MemberTypeEditingService.cs b/src/Umbraco.Core/Services/ContentTypeEditing/MemberTypeEditingService.cs index 64d7bf84bba1..f1d38d3dd6dc 100644 --- a/src/Umbraco.Core/Services/ContentTypeEditing/MemberTypeEditingService.cs +++ b/src/Umbraco.Core/Services/ContentTypeEditing/MemberTypeEditingService.cs @@ -29,7 +29,7 @@ public MemberTypeEditingService( public async Task> CreateAsync(MemberTypeCreateModel model, Guid userKey) { - Attempt result = await ValidateAndMapForCreationAsync(model, model.Key, containerKey: null); + Attempt result = await ValidateAndMapForCreationAsync(model, model.Key, model.ContainerKey); if (result.Success is false) { return result; @@ -80,7 +80,7 @@ protected override IMemberType CreateContentType(IShortStringHelper shortStringH protected override UmbracoObjectTypes ContentTypeObjectType => UmbracoObjectTypes.MemberType; - protected override UmbracoObjectTypes ContainerObjectType => throw new NotSupportedException("Member type tree does not support containers"); + protected override UmbracoObjectTypes ContainerObjectType => UmbracoObjectTypes.MemberTypeContainer; protected override ISet GetReservedFieldNames() => _reservedFieldNamesService.GetMemberReservedFieldNames(); diff --git a/src/Umbraco.Core/Services/EntityXmlSerializer.cs b/src/Umbraco.Core/Services/EntityXmlSerializer.cs index 5636b957e685..7c1c37475477 100644 --- a/src/Umbraco.Core/Services/EntityXmlSerializer.cs +++ b/src/Umbraco.Core/Services/EntityXmlSerializer.cs @@ -374,7 +374,11 @@ public XElement Serialize(IEnumerable templates) return xml; } - public XElement Serialize(IMediaType mediaType) + public XElement Serialize(IMediaType mediaType) => SerializeMediaOrMemberType(mediaType, IEntityXmlSerializer.MediaTypeElementName); + + public XElement Serialize(IMemberType memberType) => SerializeMediaOrMemberType(memberType, IEntityXmlSerializer.MemberTypeElementName); + + private XElement SerializeMediaOrMemberType(IContentTypeComposition mediaType, string elementName) { var info = new XElement( "Info", @@ -410,7 +414,7 @@ public XElement Serialize(IMediaType mediaType) SerializePropertyGroups(mediaType.PropertyGroups)); // TODO Rename to PropertyGroups var xml = new XElement( - IEntityXmlSerializer.MediaTypeElementName, + elementName, info, structure, genericProperties, diff --git a/src/Umbraco.Core/Services/IEntityXmlSerializer.cs b/src/Umbraco.Core/Services/IEntityXmlSerializer.cs index a0549d5d1bb0..bb976daffaca 100644 --- a/src/Umbraco.Core/Services/IEntityXmlSerializer.cs +++ b/src/Umbraco.Core/Services/IEntityXmlSerializer.cs @@ -10,6 +10,7 @@ public interface IEntityXmlSerializer { internal const string DocumentTypeElementName = "DocumentType"; internal const string MediaTypeElementName = "MediaType"; + internal const string MemberTypeElementName = "MemberType"; /// /// Exports an IContent item as an XElement. @@ -80,5 +81,7 @@ XElement Serialize( XElement Serialize(IMediaType mediaType); + XElement Serialize(IMemberType memberType) => throw new NotImplementedException(); + XElement Serialize(IContentType contentType); } diff --git a/src/Umbraco.Core/Services/IPackageDataInstallation.cs b/src/Umbraco.Core/Services/IPackageDataInstallation.cs index 3d285c715668..f07115544337 100644 --- a/src/Umbraco.Core/Services/IPackageDataInstallation.cs +++ b/src/Umbraco.Core/Services/IPackageDataInstallation.cs @@ -10,13 +10,21 @@ public interface IPackageDataInstallation InstallationSummary InstallPackageData(CompiledPackage compiledPackage, int userId); /// - /// Imports and saves package xml as + /// Imports and saves package xml as . /// /// Xml to import /// Optional id of the User performing the operation. Default is zero (admin). - /// An enumerable list of generated ContentTypes + /// An enumerable list of generated s. IReadOnlyList ImportMediaTypes(IEnumerable docTypeElements, int userId); + /// + /// Imports and saves package xml as . + /// + /// Xml to import + /// Optional id of the User performing the operation. Default is zero (admin). + /// An enumerable list of generated s. + IReadOnlyList ImportMemberTypes(IEnumerable docTypeElements, int userId) => throw new NotImplementedException(); + IReadOnlyList ImportContentBase( IEnumerable docs, IDictionary importedDocumentTypes, diff --git a/src/Umbraco.Core/Services/ImportExport/IMemberTypeImportService.cs b/src/Umbraco.Core/Services/ImportExport/IMemberTypeImportService.cs new file mode 100644 index 000000000000..2a8e279a2c2a --- /dev/null +++ b/src/Umbraco.Core/Services/ImportExport/IMemberTypeImportService.cs @@ -0,0 +1,12 @@ +using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Services.OperationStatus; + +namespace Umbraco.Cms.Core.Services.ImportExport; + +public interface IMemberTypeImportService +{ + Task> Import( + Guid temporaryFileId, + Guid userKey, + Guid? mediaTypeId = null); +} diff --git a/src/Umbraco.Core/Services/ImportExport/MemberTypeImportService.cs b/src/Umbraco.Core/Services/ImportExport/MemberTypeImportService.cs new file mode 100644 index 000000000000..c4ae564e11d9 --- /dev/null +++ b/src/Umbraco.Core/Services/ImportExport/MemberTypeImportService.cs @@ -0,0 +1,88 @@ +using System.Xml.Linq; +using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Models.ContentEditing; +using Umbraco.Cms.Core.Scoping; +using Umbraco.Cms.Core.Services.OperationStatus; + +namespace Umbraco.Cms.Core.Services.ImportExport; + +public class MemberTypeImportService : IMemberTypeImportService +{ + private readonly IPackageDataInstallation _packageDataInstallation; + private readonly IEntityService _entityService; + private readonly ITemporaryFileToXmlImportService _temporaryFileToXmlImportService; + private readonly ICoreScopeProvider _coreScopeProvider; + private readonly IUserIdKeyResolver _userIdKeyResolver; + + public MemberTypeImportService( + IPackageDataInstallation packageDataInstallation, + IEntityService entityService, + ITemporaryFileToXmlImportService temporaryFileToXmlImportService, + ICoreScopeProvider coreScopeProvider, + IUserIdKeyResolver userIdKeyResolver) + { + _packageDataInstallation = packageDataInstallation; + _entityService = entityService; + _temporaryFileToXmlImportService = temporaryFileToXmlImportService; + _coreScopeProvider = coreScopeProvider; + _userIdKeyResolver = userIdKeyResolver; + } + + public async Task> Import( + Guid temporaryFileId, + Guid userKey, + Guid? memberTypeId = null) + { + using ICoreScope scope = _coreScopeProvider.CreateCoreScope(); + + _temporaryFileToXmlImportService.CleanupFileIfScopeCompletes(temporaryFileId); + Attempt loadXmlAttempt = + await _temporaryFileToXmlImportService.LoadXElementFromTemporaryFileAsync(temporaryFileId); + if (loadXmlAttempt.Success is false) + { + return Attempt.FailWithStatus( + loadXmlAttempt.Status is TemporaryFileXmlImportOperationStatus.TemporaryFileNotFound + ? MemberTypeImportOperationStatus.TemporaryFileNotFound + : MemberTypeImportOperationStatus.TemporaryFileConversionFailure, + null); + } + + Attempt packageEntityTypeAttempt = _temporaryFileToXmlImportService.GetEntityType(loadXmlAttempt.Result!); + if (packageEntityTypeAttempt.Success is false || + packageEntityTypeAttempt.Result is not UmbracoEntityTypes.MemberType) + { + return Attempt.FailWithStatus( + MemberTypeImportOperationStatus.TypeMismatch, + null); + } + + Guid packageEntityKey = _packageDataInstallation.GetContentTypeKey(loadXmlAttempt.Result!); + if (memberTypeId is not null && memberTypeId.Equals(packageEntityKey) is false) + { + return Attempt.FailWithStatus( + MemberTypeImportOperationStatus.IdMismatch, + null); + } + + var entityExits = _entityService.Exists( + _packageDataInstallation.GetContentTypeKey(loadXmlAttempt.Result!), + UmbracoObjectTypes.MemberType); + if (entityExits && memberTypeId is null) + { + return Attempt.FailWithStatus( + MemberTypeImportOperationStatus.MemberTypeExists, + null); + } + + IReadOnlyList importResult = + _packageDataInstallation.ImportMemberTypes(new[] { loadXmlAttempt.Result! }, await _userIdKeyResolver.GetAsync(userKey)); + + scope.Complete(); + + return Attempt.SucceedWithStatus( + entityExits + ? MemberTypeImportOperationStatus.SuccessUpdated + : MemberTypeImportOperationStatus.SuccessCreated, + importResult[0]); + } +} diff --git a/src/Umbraco.Core/Services/ImportExport/TemporaryFileToXmlImportService.cs b/src/Umbraco.Core/Services/ImportExport/TemporaryFileToXmlImportService.cs index b8621a50443e..a8aa8a1542f0 100644 --- a/src/Umbraco.Core/Services/ImportExport/TemporaryFileToXmlImportService.cs +++ b/src/Umbraco.Core/Services/ImportExport/TemporaryFileToXmlImportService.cs @@ -61,6 +61,8 @@ public Attempt GetEntityType(XElement entityElement) => Attempt.Succeed(UmbracoEntityTypes.DocumentType), IEntityXmlSerializer.MediaTypeElementName => Attempt.Succeed(UmbracoEntityTypes.MediaType), + IEntityXmlSerializer.MemberTypeElementName + => Attempt.Succeed(UmbracoEntityTypes.MemberType), _ => Attempt.Fail() }; } diff --git a/src/Umbraco.Core/Services/OperationStatus/MemberTypeImportOperationStatus.cs b/src/Umbraco.Core/Services/OperationStatus/MemberTypeImportOperationStatus.cs new file mode 100644 index 000000000000..26af22d9bd52 --- /dev/null +++ b/src/Umbraco.Core/Services/OperationStatus/MemberTypeImportOperationStatus.cs @@ -0,0 +1,12 @@ +namespace Umbraco.Cms.Core.Services.OperationStatus; + +public enum MemberTypeImportOperationStatus +{ + SuccessCreated, + SuccessUpdated, + TemporaryFileNotFound, + TemporaryFileConversionFailure, + MemberTypeExists, + TypeMismatch, + IdMismatch +} diff --git a/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs b/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs index 977497c0842e..b9461d6faf2b 100644 --- a/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs +++ b/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs @@ -41,6 +41,7 @@ public class PackageDataInstallation : IPackageDataInstallation private readonly IEntityService _entityService; private readonly IContentTypeService _contentTypeService; private readonly IContentService _contentService; + private readonly IMemberTypeService _memberTypeService; public PackageDataInstallation( IDataValueEditorFactory dataValueEditorFactory, @@ -58,7 +59,8 @@ public PackageDataInstallation( IMediaService mediaService, IMediaTypeService mediaTypeService, ITemplateContentParserService templateContentParserService, - ITemplateService templateService) + ITemplateService templateService, + IMemberTypeService memberTypeService) { _dataValueEditorFactory = dataValueEditorFactory; _logger = logger; @@ -76,10 +78,48 @@ public PackageDataInstallation( _mediaTypeService = mediaTypeService; _templateContentParserService = templateContentParserService; _templateService = templateService; + _memberTypeService = memberTypeService; } - // Also remove factory service registration when this constructor is removed - [Obsolete("Use the constructor with Infrastructure.IScopeProvider and without global settings and hosting environment instead.")] + [Obsolete("Please use the constructor with all parameters. Scheduled for removal in Umbraco 19.")] + public PackageDataInstallation( + IDataValueEditorFactory dataValueEditorFactory, + ILogger logger, + IFileService fileService, + ILocalizationService localizationService, + IDataTypeService dataTypeService, + IEntityService entityService, + IContentTypeService contentTypeService, + IContentService contentService, + PropertyEditorCollection propertyEditors, + IScopeProvider scopeProvider, + IShortStringHelper shortStringHelper, + IConfigurationEditorJsonSerializer serializer, + IMediaService mediaService, + IMediaTypeService mediaTypeService, + ITemplateContentParserService templateContentParserService, + ITemplateService templateService) + : this( + dataValueEditorFactory, + logger, + fileService, + localizationService, + dataTypeService, + entityService, + contentTypeService, + contentService, + propertyEditors, + scopeProvider, + shortStringHelper, + serializer, + mediaService, + mediaTypeService, + templateContentParserService, + templateService, + StaticServiceProvider.Instance.GetRequiredService()) + { } + + [Obsolete("Please use the constructor with all parameters. Scheduled for removal in Umbraco 19.")] public PackageDataInstallation( IDataValueEditorFactory dataValueEditorFactory, ILogger logger, @@ -107,7 +147,7 @@ public PackageDataInstallation( contentTypeService, contentService, propertyEditors, - (Umbraco.Cms.Infrastructure.Scoping.IScopeProvider)scopeProvider, + (IScopeProvider)scopeProvider, shortStringHelper, serializer, mediaService, @@ -163,27 +203,27 @@ public InstallationSummary InstallPackageData(CompiledPackage compiledPackage, i } } - /// - /// Imports and saves package xml as - /// - /// Xml to import - /// Optional id of the User performing the operation. Default is zero (admin). - /// An enumerable list of generated ContentTypes + /// public IReadOnlyList ImportMediaTypes(IEnumerable docTypeElements, int userId) +#pragma warning disable CS0618 // Type or member is obsolete => ImportMediaTypes(docTypeElements, userId, out _); +#pragma warning restore CS0618 // Type or member is obsolete - /// - /// Imports and saves package xml as - /// - /// Xml to import - /// Optional id of the User performing the operation. Default is zero (admin). - /// Collection of entity containers installed by the package to be populated with those created in installing data types. - /// An enumerable list of generated ContentTypes + [Obsolete("This method is not used in Umbraco outside of this class so will be made private in Umbraco 19.")] public IReadOnlyList ImportMediaTypes(IEnumerable docTypeElements, int userId, out IEnumerable entityContainersInstalled) => ImportDocumentTypes(docTypeElements.ToList(), true, userId, _mediaTypeService, out entityContainersInstalled); + /// + public IReadOnlyList ImportMemberTypes(IEnumerable docTypeElements, int userId) + => ImportMemberTypes(docTypeElements, userId, out _); + + private IReadOnlyList ImportMemberTypes(IEnumerable docTypeElements, int userId, + out IEnumerable entityContainersInstalled) + => ImportDocumentTypes(docTypeElements.ToList(), true, userId, _memberTypeService, + out entityContainersInstalled); + #endregion #region Content @@ -805,26 +845,23 @@ private T CreateContentTypeFromXml( { if (typeof(T) == typeof(IContentType)) { - if (parent is null) - { - return new ContentType(_shortStringHelper, parentId) { Alias = alias, Key = key } as T; - } - else - { - return new ContentType(_shortStringHelper, (IContentType)parent, alias) { Key = key } as T; - } + return parent is null + ? new ContentType(_shortStringHelper, parentId) { Alias = alias, Key = key } as T + : new ContentType(_shortStringHelper, (IContentType)parent, alias) { Key = key } as T; } if (typeof(T) == typeof(IMediaType)) { - if (parent is null) - { - return new MediaType(_shortStringHelper, parentId) { Alias = alias, Key = key } as T; - } - else - { - return new MediaType(_shortStringHelper, (IMediaType)parent, alias) { Key = key } as T; - } + return parent is null + ? new MediaType(_shortStringHelper, parentId) { Alias = alias, Key = key } as T + : new MediaType(_shortStringHelper, (IMediaType)parent, alias) { Key = key } as T; + } + + if (typeof(T) == typeof(IMemberType)) + { + return parent is null + ? new MemberType(_shortStringHelper, parentId) { Alias = alias, Key = key } as T + : new MemberType(_shortStringHelper, (IMemberType)parent, alias) { Key = key } as T; } throw new NotSupportedException($"Type {typeof(T)} is not supported"); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/backend-api/sdk.gen.ts b/src/Umbraco.Web.UI.Client/src/packages/core/backend-api/sdk.gen.ts index 65dfc31492b9..66795930eb5d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/backend-api/sdk.gen.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/backend-api/sdk.gen.ts @@ -2,7 +2,7 @@ import { type Client, formDataBodySerializer, type Options as Options2, type TDataShape } from './client'; import { client } from './client.gen'; -import type { DeleteDataTypeByIdData, DeleteDataTypeByIdErrors, DeleteDataTypeByIdResponses, DeleteDataTypeFolderByIdData, DeleteDataTypeFolderByIdErrors, DeleteDataTypeFolderByIdResponses, DeleteDictionaryByIdData, DeleteDictionaryByIdErrors, DeleteDictionaryByIdResponses, DeleteDocumentBlueprintByIdData, DeleteDocumentBlueprintByIdErrors, DeleteDocumentBlueprintByIdResponses, DeleteDocumentBlueprintFolderByIdData, DeleteDocumentBlueprintFolderByIdErrors, DeleteDocumentBlueprintFolderByIdResponses, DeleteDocumentByIdData, DeleteDocumentByIdErrors, DeleteDocumentByIdPublicAccessData, DeleteDocumentByIdPublicAccessErrors, DeleteDocumentByIdPublicAccessResponses, DeleteDocumentByIdResponses, DeleteDocumentTypeByIdData, DeleteDocumentTypeByIdErrors, DeleteDocumentTypeByIdResponses, DeleteDocumentTypeFolderByIdData, DeleteDocumentTypeFolderByIdErrors, DeleteDocumentTypeFolderByIdResponses, DeleteLanguageByIsoCodeData, DeleteLanguageByIsoCodeErrors, DeleteLanguageByIsoCodeResponses, DeleteLogViewerSavedSearchByNameData, DeleteLogViewerSavedSearchByNameErrors, DeleteLogViewerSavedSearchByNameResponses, DeleteMediaByIdData, DeleteMediaByIdErrors, DeleteMediaByIdResponses, DeleteMediaTypeByIdData, DeleteMediaTypeByIdErrors, DeleteMediaTypeByIdResponses, DeleteMediaTypeFolderByIdData, DeleteMediaTypeFolderByIdErrors, DeleteMediaTypeFolderByIdResponses, DeleteMemberByIdData, DeleteMemberByIdErrors, DeleteMemberByIdResponses, DeleteMemberGroupByIdData, DeleteMemberGroupByIdErrors, DeleteMemberGroupByIdResponses, DeleteMemberTypeByIdData, DeleteMemberTypeByIdErrors, DeleteMemberTypeByIdResponses, DeleteMemberTypeFolderByIdData, DeleteMemberTypeFolderByIdErrors, DeleteMemberTypeFolderByIdResponses, DeletePackageCreatedByIdData, DeletePackageCreatedByIdErrors, DeletePackageCreatedByIdResponses, DeletePartialViewByPathData, DeletePartialViewByPathErrors, DeletePartialViewByPathResponses, DeletePartialViewFolderByPathData, DeletePartialViewFolderByPathErrors, DeletePartialViewFolderByPathResponses, DeletePreviewData, DeletePreviewResponses, DeleteRecycleBinDocumentByIdData, DeleteRecycleBinDocumentByIdErrors, DeleteRecycleBinDocumentByIdResponses, DeleteRecycleBinDocumentData, DeleteRecycleBinDocumentErrors, DeleteRecycleBinDocumentResponses, DeleteRecycleBinMediaByIdData, DeleteRecycleBinMediaByIdErrors, DeleteRecycleBinMediaByIdResponses, DeleteRecycleBinMediaData, DeleteRecycleBinMediaErrors, DeleteRecycleBinMediaResponses, DeleteRedirectManagementByIdData, DeleteRedirectManagementByIdErrors, DeleteRedirectManagementByIdResponses, DeleteScriptByPathData, DeleteScriptByPathErrors, DeleteScriptByPathResponses, DeleteScriptFolderByPathData, DeleteScriptFolderByPathErrors, DeleteScriptFolderByPathResponses, DeleteStylesheetByPathData, DeleteStylesheetByPathErrors, DeleteStylesheetByPathResponses, DeleteStylesheetFolderByPathData, DeleteStylesheetFolderByPathErrors, DeleteStylesheetFolderByPathResponses, DeleteTemplateByIdData, DeleteTemplateByIdErrors, DeleteTemplateByIdResponses, DeleteTemporaryFileByIdData, DeleteTemporaryFileByIdErrors, DeleteTemporaryFileByIdResponses, DeleteUserAvatarByIdData, DeleteUserAvatarByIdErrors, DeleteUserAvatarByIdResponses, DeleteUserById2FaByProviderNameData, DeleteUserById2FaByProviderNameErrors, DeleteUserById2FaByProviderNameResponses, DeleteUserByIdClientCredentialsByClientIdData, DeleteUserByIdClientCredentialsByClientIdErrors, DeleteUserByIdClientCredentialsByClientIdResponses, DeleteUserByIdData, DeleteUserByIdErrors, DeleteUserByIdResponses, DeleteUserCurrent2FaByProviderNameData, DeleteUserCurrent2FaByProviderNameErrors, DeleteUserCurrent2FaByProviderNameResponses, DeleteUserData, DeleteUserDataByIdData, DeleteUserDataByIdErrors, DeleteUserDataByIdResponses, DeleteUserErrors, DeleteUserGroupByIdData, DeleteUserGroupByIdErrors, DeleteUserGroupByIdResponses, DeleteUserGroupByIdUsersData, DeleteUserGroupByIdUsersErrors, DeleteUserGroupByIdUsersResponses, DeleteUserGroupData, DeleteUserGroupErrors, DeleteUserGroupResponses, DeleteUserResponses, DeleteWebhookByIdData, DeleteWebhookByIdErrors, DeleteWebhookByIdResponses, GetCollectionDocumentByIdData, GetCollectionDocumentByIdErrors, GetCollectionDocumentByIdResponses, GetCollectionMediaData, GetCollectionMediaErrors, GetCollectionMediaResponses, GetCultureData, GetCultureErrors, GetCultureResponses, GetDataTypeByIdData, GetDataTypeByIdErrors, GetDataTypeByIdIsUsedData, GetDataTypeByIdIsUsedErrors, GetDataTypeByIdIsUsedResponses, GetDataTypeByIdReferencedByData, GetDataTypeByIdReferencedByErrors, GetDataTypeByIdReferencedByResponses, GetDataTypeByIdResponses, GetDataTypeConfigurationData, GetDataTypeConfigurationErrors, GetDataTypeConfigurationResponses, GetDataTypeFolderByIdData, GetDataTypeFolderByIdErrors, GetDataTypeFolderByIdResponses, GetDictionaryByIdData, GetDictionaryByIdErrors, GetDictionaryByIdExportData, GetDictionaryByIdExportErrors, GetDictionaryByIdExportResponses, GetDictionaryByIdResponses, GetDictionaryData, GetDictionaryErrors, GetDictionaryResponses, GetDocumentAreReferencedData, GetDocumentAreReferencedErrors, GetDocumentAreReferencedResponses, GetDocumentBlueprintByIdData, GetDocumentBlueprintByIdErrors, GetDocumentBlueprintByIdResponses, GetDocumentBlueprintByIdScaffoldData, GetDocumentBlueprintByIdScaffoldErrors, GetDocumentBlueprintByIdScaffoldResponses, GetDocumentBlueprintFolderByIdData, GetDocumentBlueprintFolderByIdErrors, GetDocumentBlueprintFolderByIdResponses, GetDocumentByIdAuditLogData, GetDocumentByIdAuditLogErrors, GetDocumentByIdAuditLogResponses, GetDocumentByIdAvailableSegmentOptionsData, GetDocumentByIdAvailableSegmentOptionsErrors, GetDocumentByIdAvailableSegmentOptionsResponses, GetDocumentByIdData, GetDocumentByIdDomainsData, GetDocumentByIdDomainsErrors, GetDocumentByIdDomainsResponses, GetDocumentByIdErrors, GetDocumentByIdNotificationsData, GetDocumentByIdNotificationsErrors, GetDocumentByIdNotificationsResponses, GetDocumentByIdPreviewUrlData, GetDocumentByIdPreviewUrlErrors, GetDocumentByIdPreviewUrlResponses, GetDocumentByIdPublicAccessData, GetDocumentByIdPublicAccessErrors, GetDocumentByIdPublicAccessResponses, GetDocumentByIdPublishedData, GetDocumentByIdPublishedErrors, GetDocumentByIdPublishedResponses, GetDocumentByIdPublishWithDescendantsResultByTaskIdData, GetDocumentByIdPublishWithDescendantsResultByTaskIdErrors, GetDocumentByIdPublishWithDescendantsResultByTaskIdResponses, GetDocumentByIdReferencedByData, GetDocumentByIdReferencedByErrors, GetDocumentByIdReferencedByResponses, GetDocumentByIdReferencedDescendantsData, GetDocumentByIdReferencedDescendantsErrors, GetDocumentByIdReferencedDescendantsResponses, GetDocumentByIdResponses, GetDocumentConfigurationData, GetDocumentConfigurationErrors, GetDocumentConfigurationResponses, GetDocumentTypeAllowedAtRootData, GetDocumentTypeAllowedAtRootErrors, GetDocumentTypeAllowedAtRootResponses, GetDocumentTypeByIdAllowedChildrenData, GetDocumentTypeByIdAllowedChildrenErrors, GetDocumentTypeByIdAllowedChildrenResponses, GetDocumentTypeByIdBlueprintData, GetDocumentTypeByIdBlueprintErrors, GetDocumentTypeByIdBlueprintResponses, GetDocumentTypeByIdCompositionReferencesData, GetDocumentTypeByIdCompositionReferencesErrors, GetDocumentTypeByIdCompositionReferencesResponses, GetDocumentTypeByIdData, GetDocumentTypeByIdErrors, GetDocumentTypeByIdExportData, GetDocumentTypeByIdExportErrors, GetDocumentTypeByIdExportResponses, GetDocumentTypeByIdResponses, GetDocumentTypeConfigurationData, GetDocumentTypeConfigurationErrors, GetDocumentTypeConfigurationResponses, GetDocumentTypeFolderByIdData, GetDocumentTypeFolderByIdErrors, GetDocumentTypeFolderByIdResponses, GetDocumentUrlsData, GetDocumentUrlsErrors, GetDocumentUrlsResponses, GetDocumentVersionByIdData, GetDocumentVersionByIdErrors, GetDocumentVersionByIdResponses, GetDocumentVersionData, GetDocumentVersionErrors, GetDocumentVersionResponses, GetDynamicRootStepsData, GetDynamicRootStepsErrors, GetDynamicRootStepsResponses, GetFilterDataTypeData, GetFilterDataTypeErrors, GetFilterDataTypeResponses, GetFilterMemberData, GetFilterMemberErrors, GetFilterMemberResponses, GetFilterUserData, GetFilterUserErrors, GetFilterUserGroupData, GetFilterUserGroupErrors, GetFilterUserGroupResponses, GetFilterUserResponses, GetHealthCheckGroupByNameData, GetHealthCheckGroupByNameErrors, GetHealthCheckGroupByNameResponses, GetHealthCheckGroupData, GetHealthCheckGroupErrors, GetHealthCheckGroupResponses, GetHelpData, GetHelpErrors, GetHelpResponses, GetImagingResizeUrlsData, GetImagingResizeUrlsErrors, GetImagingResizeUrlsResponses, GetImportAnalyzeData, GetImportAnalyzeErrors, GetImportAnalyzeResponses, GetIndexerByIndexNameData, GetIndexerByIndexNameErrors, GetIndexerByIndexNameResponses, GetIndexerData, GetIndexerErrors, GetIndexerResponses, GetInstallSettingsData, GetInstallSettingsErrors, GetInstallSettingsResponses, GetItemDataTypeData, GetItemDataTypeErrors, GetItemDataTypeResponses, GetItemDataTypeSearchData, GetItemDataTypeSearchErrors, GetItemDataTypeSearchResponses, GetItemDictionaryData, GetItemDictionaryErrors, GetItemDictionaryResponses, GetItemDocumentBlueprintData, GetItemDocumentBlueprintErrors, GetItemDocumentBlueprintResponses, GetItemDocumentData, GetItemDocumentErrors, GetItemDocumentResponses, GetItemDocumentSearchData, GetItemDocumentSearchErrors, GetItemDocumentSearchResponses, GetItemDocumentTypeData, GetItemDocumentTypeErrors, GetItemDocumentTypeResponses, GetItemDocumentTypeSearchData, GetItemDocumentTypeSearchErrors, GetItemDocumentTypeSearchResponses, GetItemLanguageData, GetItemLanguageDefaultData, GetItemLanguageDefaultErrors, GetItemLanguageDefaultResponses, GetItemLanguageErrors, GetItemLanguageResponses, GetItemMediaData, GetItemMediaErrors, GetItemMediaResponses, GetItemMediaSearchData, GetItemMediaSearchErrors, GetItemMediaSearchResponses, GetItemMediaTypeAllowedData, GetItemMediaTypeAllowedErrors, GetItemMediaTypeAllowedResponses, GetItemMediaTypeData, GetItemMediaTypeErrors, GetItemMediaTypeFoldersData, GetItemMediaTypeFoldersErrors, GetItemMediaTypeFoldersResponses, GetItemMediaTypeResponses, GetItemMediaTypeSearchData, GetItemMediaTypeSearchErrors, GetItemMediaTypeSearchResponses, GetItemMemberData, GetItemMemberErrors, GetItemMemberGroupData, GetItemMemberGroupErrors, GetItemMemberGroupResponses, GetItemMemberResponses, GetItemMemberSearchData, GetItemMemberSearchErrors, GetItemMemberSearchResponses, GetItemMemberTypeData, GetItemMemberTypeErrors, GetItemMemberTypeResponses, GetItemMemberTypeSearchData, GetItemMemberTypeSearchErrors, GetItemMemberTypeSearchResponses, GetItemPartialViewData, GetItemPartialViewErrors, GetItemPartialViewResponses, GetItemRelationTypeData, GetItemRelationTypeErrors, GetItemRelationTypeResponses, GetItemScriptData, GetItemScriptErrors, GetItemScriptResponses, GetItemStaticFileData, GetItemStaticFileErrors, GetItemStaticFileResponses, GetItemStylesheetData, GetItemStylesheetErrors, GetItemStylesheetResponses, GetItemTemplateData, GetItemTemplateErrors, GetItemTemplateResponses, GetItemTemplateSearchData, GetItemTemplateSearchErrors, GetItemTemplateSearchResponses, GetItemUserData, GetItemUserErrors, GetItemUserGroupData, GetItemUserGroupErrors, GetItemUserGroupResponses, GetItemUserResponses, GetItemWebhookData, GetItemWebhookErrors, GetItemWebhookResponses, GetLanguageByIsoCodeData, GetLanguageByIsoCodeErrors, GetLanguageByIsoCodeResponses, GetLanguageData, GetLanguageErrors, GetLanguageResponses, GetLogViewerLevelCountData, GetLogViewerLevelCountErrors, GetLogViewerLevelCountResponses, GetLogViewerLevelData, GetLogViewerLevelErrors, GetLogViewerLevelResponses, GetLogViewerLogData, GetLogViewerLogErrors, GetLogViewerLogResponses, GetLogViewerMessageTemplateData, GetLogViewerMessageTemplateErrors, GetLogViewerMessageTemplateResponses, GetLogViewerSavedSearchByNameData, GetLogViewerSavedSearchByNameErrors, GetLogViewerSavedSearchByNameResponses, GetLogViewerSavedSearchData, GetLogViewerSavedSearchErrors, GetLogViewerSavedSearchResponses, GetLogViewerValidateLogsSizeData, GetLogViewerValidateLogsSizeErrors, GetLogViewerValidateLogsSizeResponses, GetManifestManifestData, GetManifestManifestErrors, GetManifestManifestPrivateData, GetManifestManifestPrivateErrors, GetManifestManifestPrivateResponses, GetManifestManifestPublicData, GetManifestManifestPublicResponses, GetManifestManifestResponses, GetMediaAreReferencedData, GetMediaAreReferencedErrors, GetMediaAreReferencedResponses, GetMediaByIdAuditLogData, GetMediaByIdAuditLogErrors, GetMediaByIdAuditLogResponses, GetMediaByIdData, GetMediaByIdErrors, GetMediaByIdReferencedByData, GetMediaByIdReferencedByErrors, GetMediaByIdReferencedByResponses, GetMediaByIdReferencedDescendantsData, GetMediaByIdReferencedDescendantsErrors, GetMediaByIdReferencedDescendantsResponses, GetMediaByIdResponses, GetMediaConfigurationData, GetMediaConfigurationErrors, GetMediaConfigurationResponses, GetMediaTypeAllowedAtRootData, GetMediaTypeAllowedAtRootErrors, GetMediaTypeAllowedAtRootResponses, GetMediaTypeByIdAllowedChildrenData, GetMediaTypeByIdAllowedChildrenErrors, GetMediaTypeByIdAllowedChildrenResponses, GetMediaTypeByIdCompositionReferencesData, GetMediaTypeByIdCompositionReferencesErrors, GetMediaTypeByIdCompositionReferencesResponses, GetMediaTypeByIdData, GetMediaTypeByIdErrors, GetMediaTypeByIdExportData, GetMediaTypeByIdExportErrors, GetMediaTypeByIdExportResponses, GetMediaTypeByIdResponses, GetMediaTypeConfigurationData, GetMediaTypeConfigurationErrors, GetMediaTypeConfigurationResponses, GetMediaTypeFolderByIdData, GetMediaTypeFolderByIdErrors, GetMediaTypeFolderByIdResponses, GetMediaUrlsData, GetMediaUrlsErrors, GetMediaUrlsResponses, GetMemberAreReferencedData, GetMemberAreReferencedErrors, GetMemberAreReferencedResponses, GetMemberByIdData, GetMemberByIdErrors, GetMemberByIdReferencedByData, GetMemberByIdReferencedByErrors, GetMemberByIdReferencedByResponses, GetMemberByIdReferencedDescendantsData, GetMemberByIdReferencedDescendantsErrors, GetMemberByIdReferencedDescendantsResponses, GetMemberByIdResponses, GetMemberConfigurationData, GetMemberConfigurationErrors, GetMemberConfigurationResponses, GetMemberGroupByIdData, GetMemberGroupByIdErrors, GetMemberGroupByIdResponses, GetMemberGroupData, GetMemberGroupErrors, GetMemberGroupResponses, GetMemberTypeByIdCompositionReferencesData, GetMemberTypeByIdCompositionReferencesErrors, GetMemberTypeByIdCompositionReferencesResponses, GetMemberTypeByIdData, GetMemberTypeByIdErrors, GetMemberTypeByIdResponses, GetMemberTypeConfigurationData, GetMemberTypeConfigurationErrors, GetMemberTypeConfigurationResponses, GetMemberTypeFolderByIdData, GetMemberTypeFolderByIdErrors, GetMemberTypeFolderByIdResponses, GetModelsBuilderDashboardData, GetModelsBuilderDashboardErrors, GetModelsBuilderDashboardResponses, GetModelsBuilderStatusData, GetModelsBuilderStatusErrors, GetModelsBuilderStatusResponses, GetNewsDashboardData, GetNewsDashboardErrors, GetNewsDashboardResponses, GetObjectTypesData, GetObjectTypesErrors, GetObjectTypesResponses, GetOembedQueryData, GetOembedQueryErrors, GetOembedQueryResponses, GetPackageConfigurationData, GetPackageConfigurationErrors, GetPackageConfigurationResponses, GetPackageCreatedByIdData, GetPackageCreatedByIdDownloadData, GetPackageCreatedByIdDownloadErrors, GetPackageCreatedByIdDownloadResponses, GetPackageCreatedByIdErrors, GetPackageCreatedByIdResponses, GetPackageCreatedData, GetPackageCreatedErrors, GetPackageCreatedResponses, GetPackageMigrationStatusData, GetPackageMigrationStatusErrors, GetPackageMigrationStatusResponses, GetPartialViewByPathData, GetPartialViewByPathErrors, GetPartialViewByPathResponses, GetPartialViewFolderByPathData, GetPartialViewFolderByPathErrors, GetPartialViewFolderByPathResponses, GetPartialViewSnippetByIdData, GetPartialViewSnippetByIdErrors, GetPartialViewSnippetByIdResponses, GetPartialViewSnippetData, GetPartialViewSnippetErrors, GetPartialViewSnippetResponses, GetProfilingStatusData, GetProfilingStatusErrors, GetProfilingStatusResponses, GetPropertyTypeIsUsedData, GetPropertyTypeIsUsedErrors, GetPropertyTypeIsUsedResponses, GetPublishedCacheRebuildStatusData, GetPublishedCacheRebuildStatusErrors, GetPublishedCacheRebuildStatusResponses, GetRecycleBinDocumentByIdOriginalParentData, GetRecycleBinDocumentByIdOriginalParentErrors, GetRecycleBinDocumentByIdOriginalParentResponses, GetRecycleBinDocumentChildrenData, GetRecycleBinDocumentChildrenErrors, GetRecycleBinDocumentChildrenResponses, GetRecycleBinDocumentReferencedByData, GetRecycleBinDocumentReferencedByErrors, GetRecycleBinDocumentReferencedByResponses, GetRecycleBinDocumentRootData, GetRecycleBinDocumentRootErrors, GetRecycleBinDocumentRootResponses, GetRecycleBinDocumentSiblingsData, GetRecycleBinDocumentSiblingsErrors, GetRecycleBinDocumentSiblingsResponses, GetRecycleBinMediaByIdOriginalParentData, GetRecycleBinMediaByIdOriginalParentErrors, GetRecycleBinMediaByIdOriginalParentResponses, GetRecycleBinMediaChildrenData, GetRecycleBinMediaChildrenErrors, GetRecycleBinMediaChildrenResponses, GetRecycleBinMediaReferencedByData, GetRecycleBinMediaReferencedByErrors, GetRecycleBinMediaReferencedByResponses, GetRecycleBinMediaRootData, GetRecycleBinMediaRootErrors, GetRecycleBinMediaRootResponses, GetRecycleBinMediaSiblingsData, GetRecycleBinMediaSiblingsErrors, GetRecycleBinMediaSiblingsResponses, GetRedirectManagementByIdData, GetRedirectManagementByIdErrors, GetRedirectManagementByIdResponses, GetRedirectManagementData, GetRedirectManagementErrors, GetRedirectManagementResponses, GetRedirectManagementStatusData, GetRedirectManagementStatusErrors, GetRedirectManagementStatusResponses, GetRelationByRelationTypeIdData, GetRelationByRelationTypeIdErrors, GetRelationByRelationTypeIdResponses, GetRelationTypeByIdData, GetRelationTypeByIdErrors, GetRelationTypeByIdResponses, GetRelationTypeData, GetRelationTypeErrors, GetRelationTypeResponses, GetScriptByPathData, GetScriptByPathErrors, GetScriptByPathResponses, GetScriptFolderByPathData, GetScriptFolderByPathErrors, GetScriptFolderByPathResponses, GetSearcherBySearcherNameQueryData, GetSearcherBySearcherNameQueryErrors, GetSearcherBySearcherNameQueryResponses, GetSearcherData, GetSearcherErrors, GetSearcherResponses, GetSecurityConfigurationData, GetSecurityConfigurationErrors, GetSecurityConfigurationResponses, GetSegmentData, GetSegmentErrors, GetSegmentResponses, GetServerConfigurationData, GetServerConfigurationResponses, GetServerInformationData, GetServerInformationErrors, GetServerInformationResponses, GetServerStatusData, GetServerStatusErrors, GetServerStatusResponses, GetServerTroubleshootingData, GetServerTroubleshootingErrors, GetServerTroubleshootingResponses, GetServerUpgradeCheckData, GetServerUpgradeCheckErrors, GetServerUpgradeCheckResponses, GetStylesheetByPathData, GetStylesheetByPathErrors, GetStylesheetByPathResponses, GetStylesheetFolderByPathData, GetStylesheetFolderByPathErrors, GetStylesheetFolderByPathResponses, GetTagData, GetTagErrors, GetTagResponses, GetTelemetryData, GetTelemetryErrors, GetTelemetryLevelData, GetTelemetryLevelErrors, GetTelemetryLevelResponses, GetTelemetryResponses, GetTemplateByIdData, GetTemplateByIdErrors, GetTemplateByIdResponses, GetTemplateConfigurationData, GetTemplateConfigurationErrors, GetTemplateConfigurationResponses, GetTemplateQuerySettingsData, GetTemplateQuerySettingsErrors, GetTemplateQuerySettingsResponses, GetTemporaryFileByIdData, GetTemporaryFileByIdErrors, GetTemporaryFileByIdResponses, GetTemporaryFileConfigurationData, GetTemporaryFileConfigurationErrors, GetTemporaryFileConfigurationResponses, GetTreeDataTypeAncestorsData, GetTreeDataTypeAncestorsErrors, GetTreeDataTypeAncestorsResponses, GetTreeDataTypeChildrenData, GetTreeDataTypeChildrenErrors, GetTreeDataTypeChildrenResponses, GetTreeDataTypeRootData, GetTreeDataTypeRootErrors, GetTreeDataTypeRootResponses, GetTreeDataTypeSiblingsData, GetTreeDataTypeSiblingsErrors, GetTreeDataTypeSiblingsResponses, GetTreeDictionaryAncestorsData, GetTreeDictionaryAncestorsErrors, GetTreeDictionaryAncestorsResponses, GetTreeDictionaryChildrenData, GetTreeDictionaryChildrenErrors, GetTreeDictionaryChildrenResponses, GetTreeDictionaryRootData, GetTreeDictionaryRootErrors, GetTreeDictionaryRootResponses, GetTreeDocumentAncestorsData, GetTreeDocumentAncestorsErrors, GetTreeDocumentAncestorsResponses, GetTreeDocumentBlueprintAncestorsData, GetTreeDocumentBlueprintAncestorsErrors, GetTreeDocumentBlueprintAncestorsResponses, GetTreeDocumentBlueprintChildrenData, GetTreeDocumentBlueprintChildrenErrors, GetTreeDocumentBlueprintChildrenResponses, GetTreeDocumentBlueprintRootData, GetTreeDocumentBlueprintRootErrors, GetTreeDocumentBlueprintRootResponses, GetTreeDocumentBlueprintSiblingsData, GetTreeDocumentBlueprintSiblingsErrors, GetTreeDocumentBlueprintSiblingsResponses, GetTreeDocumentChildrenData, GetTreeDocumentChildrenErrors, GetTreeDocumentChildrenResponses, GetTreeDocumentRootData, GetTreeDocumentRootErrors, GetTreeDocumentRootResponses, GetTreeDocumentSiblingsData, GetTreeDocumentSiblingsErrors, GetTreeDocumentSiblingsResponses, GetTreeDocumentTypeAncestorsData, GetTreeDocumentTypeAncestorsErrors, GetTreeDocumentTypeAncestorsResponses, GetTreeDocumentTypeChildrenData, GetTreeDocumentTypeChildrenErrors, GetTreeDocumentTypeChildrenResponses, GetTreeDocumentTypeRootData, GetTreeDocumentTypeRootErrors, GetTreeDocumentTypeRootResponses, GetTreeDocumentTypeSiblingsData, GetTreeDocumentTypeSiblingsErrors, GetTreeDocumentTypeSiblingsResponses, GetTreeMediaAncestorsData, GetTreeMediaAncestorsErrors, GetTreeMediaAncestorsResponses, GetTreeMediaChildrenData, GetTreeMediaChildrenErrors, GetTreeMediaChildrenResponses, GetTreeMediaRootData, GetTreeMediaRootErrors, GetTreeMediaRootResponses, GetTreeMediaSiblingsData, GetTreeMediaSiblingsErrors, GetTreeMediaSiblingsResponses, GetTreeMediaTypeAncestorsData, GetTreeMediaTypeAncestorsErrors, GetTreeMediaTypeAncestorsResponses, GetTreeMediaTypeChildrenData, GetTreeMediaTypeChildrenErrors, GetTreeMediaTypeChildrenResponses, GetTreeMediaTypeRootData, GetTreeMediaTypeRootErrors, GetTreeMediaTypeRootResponses, GetTreeMediaTypeSiblingsData, GetTreeMediaTypeSiblingsErrors, GetTreeMediaTypeSiblingsResponses, GetTreeMemberGroupRootData, GetTreeMemberGroupRootErrors, GetTreeMemberGroupRootResponses, GetTreeMemberTypeRootData, GetTreeMemberTypeRootErrors, GetTreeMemberTypeRootResponses, GetTreeMemberTypeSiblingsData, GetTreeMemberTypeSiblingsErrors, GetTreeMemberTypeSiblingsResponses, GetTreePartialViewAncestorsData, GetTreePartialViewAncestorsErrors, GetTreePartialViewAncestorsResponses, GetTreePartialViewChildrenData, GetTreePartialViewChildrenErrors, GetTreePartialViewChildrenResponses, GetTreePartialViewRootData, GetTreePartialViewRootErrors, GetTreePartialViewRootResponses, GetTreePartialViewSiblingsData, GetTreePartialViewSiblingsErrors, GetTreePartialViewSiblingsResponses, GetTreeScriptAncestorsData, GetTreeScriptAncestorsErrors, GetTreeScriptAncestorsResponses, GetTreeScriptChildrenData, GetTreeScriptChildrenErrors, GetTreeScriptChildrenResponses, GetTreeScriptRootData, GetTreeScriptRootErrors, GetTreeScriptRootResponses, GetTreeScriptSiblingsData, GetTreeScriptSiblingsErrors, GetTreeScriptSiblingsResponses, GetTreeStaticFileAncestorsData, GetTreeStaticFileAncestorsErrors, GetTreeStaticFileAncestorsResponses, GetTreeStaticFileChildrenData, GetTreeStaticFileChildrenErrors, GetTreeStaticFileChildrenResponses, GetTreeStaticFileRootData, GetTreeStaticFileRootErrors, GetTreeStaticFileRootResponses, GetTreeStylesheetAncestorsData, GetTreeStylesheetAncestorsErrors, GetTreeStylesheetAncestorsResponses, GetTreeStylesheetChildrenData, GetTreeStylesheetChildrenErrors, GetTreeStylesheetChildrenResponses, GetTreeStylesheetRootData, GetTreeStylesheetRootErrors, GetTreeStylesheetRootResponses, GetTreeStylesheetSiblingsData, GetTreeStylesheetSiblingsErrors, GetTreeStylesheetSiblingsResponses, GetTreeTemplateAncestorsData, GetTreeTemplateAncestorsErrors, GetTreeTemplateAncestorsResponses, GetTreeTemplateChildrenData, GetTreeTemplateChildrenErrors, GetTreeTemplateChildrenResponses, GetTreeTemplateRootData, GetTreeTemplateRootErrors, GetTreeTemplateRootResponses, GetTreeTemplateSiblingsData, GetTreeTemplateSiblingsErrors, GetTreeTemplateSiblingsResponses, GetUpgradeSettingsData, GetUpgradeSettingsErrors, GetUpgradeSettingsResponses, GetUserById2FaData, GetUserById2FaErrors, GetUserById2FaResponses, GetUserByIdCalculateStartNodesData, GetUserByIdCalculateStartNodesErrors, GetUserByIdCalculateStartNodesResponses, GetUserByIdClientCredentialsData, GetUserByIdClientCredentialsErrors, GetUserByIdClientCredentialsResponses, GetUserByIdData, GetUserByIdErrors, GetUserByIdResponses, GetUserConfigurationData, GetUserConfigurationErrors, GetUserConfigurationResponses, GetUserCurrent2FaByProviderNameData, GetUserCurrent2FaByProviderNameErrors, GetUserCurrent2FaByProviderNameResponses, GetUserCurrent2FaData, GetUserCurrent2FaErrors, GetUserCurrent2FaResponses, GetUserCurrentConfigurationData, GetUserCurrentConfigurationErrors, GetUserCurrentConfigurationResponses, GetUserCurrentData, GetUserCurrentErrors, GetUserCurrentLoginProvidersData, GetUserCurrentLoginProvidersErrors, GetUserCurrentLoginProvidersResponses, GetUserCurrentPermissionsData, GetUserCurrentPermissionsDocumentData, GetUserCurrentPermissionsDocumentErrors, GetUserCurrentPermissionsDocumentResponses, GetUserCurrentPermissionsErrors, GetUserCurrentPermissionsMediaData, GetUserCurrentPermissionsMediaErrors, GetUserCurrentPermissionsMediaResponses, GetUserCurrentPermissionsResponses, GetUserCurrentResponses, GetUserData, GetUserDataByIdData, GetUserDataByIdErrors, GetUserDataByIdResponses, GetUserDataData, GetUserDataErrors, GetUserDataResponses, GetUserErrors, GetUserGroupByIdData, GetUserGroupByIdErrors, GetUserGroupByIdResponses, GetUserGroupData, GetUserGroupErrors, GetUserGroupResponses, GetUserResponses, GetWebhookByIdData, GetWebhookByIdErrors, GetWebhookByIdLogsData, GetWebhookByIdLogsErrors, GetWebhookByIdLogsResponses, GetWebhookByIdResponses, GetWebhookData, GetWebhookErrors, GetWebhookEventsData, GetWebhookEventsErrors, GetWebhookEventsResponses, GetWebhookLogsData, GetWebhookLogsErrors, GetWebhookLogsResponses, GetWebhookResponses, PostDataTypeByIdCopyData, PostDataTypeByIdCopyErrors, PostDataTypeByIdCopyResponses, PostDataTypeData, PostDataTypeErrors, PostDataTypeFolderData, PostDataTypeFolderErrors, PostDataTypeFolderResponses, PostDataTypeResponses, PostDictionaryData, PostDictionaryErrors, PostDictionaryImportData, PostDictionaryImportErrors, PostDictionaryImportResponses, PostDictionaryResponses, PostDocumentBlueprintData, PostDocumentBlueprintErrors, PostDocumentBlueprintFolderData, PostDocumentBlueprintFolderErrors, PostDocumentBlueprintFolderResponses, PostDocumentBlueprintFromDocumentData, PostDocumentBlueprintFromDocumentErrors, PostDocumentBlueprintFromDocumentResponses, PostDocumentBlueprintResponses, PostDocumentByIdCopyData, PostDocumentByIdCopyErrors, PostDocumentByIdCopyResponses, PostDocumentByIdPublicAccessData, PostDocumentByIdPublicAccessErrors, PostDocumentByIdPublicAccessResponses, PostDocumentData, PostDocumentErrors, PostDocumentResponses, PostDocumentTypeAvailableCompositionsData, PostDocumentTypeAvailableCompositionsErrors, PostDocumentTypeAvailableCompositionsResponses, PostDocumentTypeByIdCopyData, PostDocumentTypeByIdCopyErrors, PostDocumentTypeByIdCopyResponses, PostDocumentTypeData, PostDocumentTypeErrors, PostDocumentTypeFolderData, PostDocumentTypeFolderErrors, PostDocumentTypeFolderResponses, PostDocumentTypeImportData, PostDocumentTypeImportErrors, PostDocumentTypeImportResponses, PostDocumentTypeResponses, PostDocumentValidateData, PostDocumentValidateErrors, PostDocumentValidateResponses, PostDocumentVersionByIdRollbackData, PostDocumentVersionByIdRollbackErrors, PostDocumentVersionByIdRollbackResponses, PostDynamicRootQueryData, PostDynamicRootQueryErrors, PostDynamicRootQueryResponses, PostHealthCheckExecuteActionData, PostHealthCheckExecuteActionErrors, PostHealthCheckExecuteActionResponses, PostHealthCheckGroupByNameCheckData, PostHealthCheckGroupByNameCheckErrors, PostHealthCheckGroupByNameCheckResponses, PostIndexerByIndexNameRebuildData, PostIndexerByIndexNameRebuildErrors, PostIndexerByIndexNameRebuildResponses, PostInstallSetupData, PostInstallSetupErrors, PostInstallSetupResponses, PostInstallValidateDatabaseData, PostInstallValidateDatabaseErrors, PostInstallValidateDatabaseResponses, PostLanguageData, PostLanguageErrors, PostLanguageResponses, PostLogViewerSavedSearchData, PostLogViewerSavedSearchErrors, PostLogViewerSavedSearchResponses, PostMediaData, PostMediaErrors, PostMediaResponses, PostMediaTypeAvailableCompositionsData, PostMediaTypeAvailableCompositionsErrors, PostMediaTypeAvailableCompositionsResponses, PostMediaTypeByIdCopyData, PostMediaTypeByIdCopyErrors, PostMediaTypeByIdCopyResponses, PostMediaTypeData, PostMediaTypeErrors, PostMediaTypeFolderData, PostMediaTypeFolderErrors, PostMediaTypeFolderResponses, PostMediaTypeImportData, PostMediaTypeImportErrors, PostMediaTypeImportResponses, PostMediaTypeResponses, PostMediaValidateData, PostMediaValidateErrors, PostMediaValidateResponses, PostMemberData, PostMemberErrors, PostMemberGroupData, PostMemberGroupErrors, PostMemberGroupResponses, PostMemberResponses, PostMemberTypeAvailableCompositionsData, PostMemberTypeAvailableCompositionsErrors, PostMemberTypeAvailableCompositionsResponses, PostMemberTypeByIdCopyData, PostMemberTypeByIdCopyErrors, PostMemberTypeByIdCopyResponses, PostMemberTypeData, PostMemberTypeErrors, PostMemberTypeFolderData, PostMemberTypeFolderErrors, PostMemberTypeFolderResponses, PostMemberTypeResponses, PostMemberValidateData, PostMemberValidateErrors, PostMemberValidateResponses, PostModelsBuilderBuildData, PostModelsBuilderBuildErrors, PostModelsBuilderBuildResponses, PostPackageByNameRunMigrationData, PostPackageByNameRunMigrationErrors, PostPackageByNameRunMigrationResponses, PostPackageCreatedData, PostPackageCreatedErrors, PostPackageCreatedResponses, PostPartialViewData, PostPartialViewErrors, PostPartialViewFolderData, PostPartialViewFolderErrors, PostPartialViewFolderResponses, PostPartialViewResponses, PostPreviewData, PostPreviewErrors, PostPreviewResponses, PostPublishedCacheRebuildData, PostPublishedCacheRebuildErrors, PostPublishedCacheRebuildResponses, PostPublishedCacheReloadData, PostPublishedCacheReloadErrors, PostPublishedCacheReloadResponses, PostRedirectManagementStatusData, PostRedirectManagementStatusErrors, PostRedirectManagementStatusResponses, PostScriptData, PostScriptErrors, PostScriptFolderData, PostScriptFolderErrors, PostScriptFolderResponses, PostScriptResponses, PostSecurityForgotPasswordData, PostSecurityForgotPasswordErrors, PostSecurityForgotPasswordResetData, PostSecurityForgotPasswordResetErrors, PostSecurityForgotPasswordResetResponses, PostSecurityForgotPasswordResponses, PostSecurityForgotPasswordVerifyData, PostSecurityForgotPasswordVerifyErrors, PostSecurityForgotPasswordVerifyResponses, PostStylesheetData, PostStylesheetErrors, PostStylesheetFolderData, PostStylesheetFolderErrors, PostStylesheetFolderResponses, PostStylesheetResponses, PostTelemetryLevelData, PostTelemetryLevelErrors, PostTelemetryLevelResponses, PostTemplateData, PostTemplateErrors, PostTemplateQueryExecuteData, PostTemplateQueryExecuteErrors, PostTemplateQueryExecuteResponses, PostTemplateResponses, PostTemporaryFileData, PostTemporaryFileErrors, PostTemporaryFileResponses, PostUpgradeAuthorizeData, PostUpgradeAuthorizeErrors, PostUpgradeAuthorizeResponses, PostUserAvatarByIdData, PostUserAvatarByIdErrors, PostUserAvatarByIdResponses, PostUserByIdChangePasswordData, PostUserByIdChangePasswordErrors, PostUserByIdChangePasswordResponses, PostUserByIdClientCredentialsData, PostUserByIdClientCredentialsErrors, PostUserByIdClientCredentialsResponses, PostUserByIdResetPasswordData, PostUserByIdResetPasswordErrors, PostUserByIdResetPasswordResponses, PostUserCurrent2FaByProviderNameData, PostUserCurrent2FaByProviderNameErrors, PostUserCurrent2FaByProviderNameResponses, PostUserCurrentAvatarData, PostUserCurrentAvatarErrors, PostUserCurrentAvatarResponses, PostUserCurrentChangePasswordData, PostUserCurrentChangePasswordErrors, PostUserCurrentChangePasswordResponses, PostUserData, PostUserDataData, PostUserDataErrors, PostUserDataResponses, PostUserDisableData, PostUserDisableErrors, PostUserDisableResponses, PostUserEnableData, PostUserEnableErrors, PostUserEnableResponses, PostUserErrors, PostUserGroupByIdUsersData, PostUserGroupByIdUsersErrors, PostUserGroupByIdUsersResponses, PostUserGroupData, PostUserGroupErrors, PostUserGroupResponses, PostUserInviteCreatePasswordData, PostUserInviteCreatePasswordErrors, PostUserInviteCreatePasswordResponses, PostUserInviteData, PostUserInviteErrors, PostUserInviteResendData, PostUserInviteResendErrors, PostUserInviteResendResponses, PostUserInviteResponses, PostUserInviteVerifyData, PostUserInviteVerifyErrors, PostUserInviteVerifyResponses, PostUserResponses, PostUserSetUserGroupsData, PostUserSetUserGroupsErrors, PostUserSetUserGroupsResponses, PostUserUnlockData, PostUserUnlockErrors, PostUserUnlockResponses, PostWebhookData, PostWebhookErrors, PostWebhookResponses, PutDataTypeByIdData, PutDataTypeByIdErrors, PutDataTypeByIdMoveData, PutDataTypeByIdMoveErrors, PutDataTypeByIdMoveResponses, PutDataTypeByIdResponses, PutDataTypeFolderByIdData, PutDataTypeFolderByIdErrors, PutDataTypeFolderByIdResponses, PutDictionaryByIdData, PutDictionaryByIdErrors, PutDictionaryByIdMoveData, PutDictionaryByIdMoveErrors, PutDictionaryByIdMoveResponses, PutDictionaryByIdResponses, PutDocumentBlueprintByIdData, PutDocumentBlueprintByIdErrors, PutDocumentBlueprintByIdMoveData, PutDocumentBlueprintByIdMoveErrors, PutDocumentBlueprintByIdMoveResponses, PutDocumentBlueprintByIdResponses, PutDocumentBlueprintFolderByIdData, PutDocumentBlueprintFolderByIdErrors, PutDocumentBlueprintFolderByIdResponses, PutDocumentByIdData, PutDocumentByIdDomainsData, PutDocumentByIdDomainsErrors, PutDocumentByIdDomainsResponses, PutDocumentByIdErrors, PutDocumentByIdMoveData, PutDocumentByIdMoveErrors, PutDocumentByIdMoveResponses, PutDocumentByIdMoveToRecycleBinData, PutDocumentByIdMoveToRecycleBinErrors, PutDocumentByIdMoveToRecycleBinResponses, PutDocumentByIdNotificationsData, PutDocumentByIdNotificationsErrors, PutDocumentByIdNotificationsResponses, PutDocumentByIdPublicAccessData, PutDocumentByIdPublicAccessErrors, PutDocumentByIdPublicAccessResponses, PutDocumentByIdPublishData, PutDocumentByIdPublishErrors, PutDocumentByIdPublishResponses, PutDocumentByIdPublishWithDescendantsData, PutDocumentByIdPublishWithDescendantsErrors, PutDocumentByIdPublishWithDescendantsResponses, PutDocumentByIdResponses, PutDocumentByIdUnpublishData, PutDocumentByIdUnpublishErrors, PutDocumentByIdUnpublishResponses, PutDocumentSortData, PutDocumentSortErrors, PutDocumentSortResponses, PutDocumentTypeByIdData, PutDocumentTypeByIdErrors, PutDocumentTypeByIdImportData, PutDocumentTypeByIdImportErrors, PutDocumentTypeByIdImportResponses, PutDocumentTypeByIdMoveData, PutDocumentTypeByIdMoveErrors, PutDocumentTypeByIdMoveResponses, PutDocumentTypeByIdResponses, PutDocumentTypeFolderByIdData, PutDocumentTypeFolderByIdErrors, PutDocumentTypeFolderByIdResponses, PutDocumentVersionByIdPreventCleanupData, PutDocumentVersionByIdPreventCleanupErrors, PutDocumentVersionByIdPreventCleanupResponses, PutLanguageByIsoCodeData, PutLanguageByIsoCodeErrors, PutLanguageByIsoCodeResponses, PutMediaByIdData, PutMediaByIdErrors, PutMediaByIdMoveData, PutMediaByIdMoveErrors, PutMediaByIdMoveResponses, PutMediaByIdMoveToRecycleBinData, PutMediaByIdMoveToRecycleBinErrors, PutMediaByIdMoveToRecycleBinResponses, PutMediaByIdResponses, PutMediaByIdValidateData, PutMediaByIdValidateErrors, PutMediaByIdValidateResponses, PutMediaSortData, PutMediaSortErrors, PutMediaSortResponses, PutMediaTypeByIdData, PutMediaTypeByIdErrors, PutMediaTypeByIdImportData, PutMediaTypeByIdImportErrors, PutMediaTypeByIdImportResponses, PutMediaTypeByIdMoveData, PutMediaTypeByIdMoveErrors, PutMediaTypeByIdMoveResponses, PutMediaTypeByIdResponses, PutMediaTypeFolderByIdData, PutMediaTypeFolderByIdErrors, PutMediaTypeFolderByIdResponses, PutMemberByIdData, PutMemberByIdErrors, PutMemberByIdResponses, PutMemberByIdValidateData, PutMemberByIdValidateErrors, PutMemberByIdValidateResponses, PutMemberGroupByIdData, PutMemberGroupByIdErrors, PutMemberGroupByIdResponses, PutMemberTypeByIdData, PutMemberTypeByIdErrors, PutMemberTypeByIdResponses, PutMemberTypeFolderByIdData, PutMemberTypeFolderByIdErrors, PutMemberTypeFolderByIdResponses, PutPackageCreatedByIdData, PutPackageCreatedByIdErrors, PutPackageCreatedByIdResponses, PutPartialViewByPathData, PutPartialViewByPathErrors, PutPartialViewByPathRenameData, PutPartialViewByPathRenameErrors, PutPartialViewByPathRenameResponses, PutPartialViewByPathResponses, PutProfilingStatusData, PutProfilingStatusErrors, PutProfilingStatusResponses, PutRecycleBinDocumentByIdRestoreData, PutRecycleBinDocumentByIdRestoreErrors, PutRecycleBinDocumentByIdRestoreResponses, PutRecycleBinMediaByIdRestoreData, PutRecycleBinMediaByIdRestoreErrors, PutRecycleBinMediaByIdRestoreResponses, PutScriptByPathData, PutScriptByPathErrors, PutScriptByPathRenameData, PutScriptByPathRenameErrors, PutScriptByPathRenameResponses, PutScriptByPathResponses, PutStylesheetByPathData, PutStylesheetByPathErrors, PutStylesheetByPathRenameData, PutStylesheetByPathRenameErrors, PutStylesheetByPathRenameResponses, PutStylesheetByPathResponses, PutTemplateByIdData, PutTemplateByIdErrors, PutTemplateByIdResponses, PutUmbracoManagementApiV11DocumentByIdValidate11Data, PutUmbracoManagementApiV11DocumentByIdValidate11Errors, PutUmbracoManagementApiV11DocumentByIdValidate11Responses, PutUserByIdData, PutUserByIdErrors, PutUserByIdResponses, PutUserDataData, PutUserDataErrors, PutUserDataResponses, PutUserGroupByIdData, PutUserGroupByIdErrors, PutUserGroupByIdResponses, PutWebhookByIdData, PutWebhookByIdErrors, PutWebhookByIdResponses } from './types.gen'; +import type { DeleteDataTypeByIdData, DeleteDataTypeByIdErrors, DeleteDataTypeByIdResponses, DeleteDataTypeFolderByIdData, DeleteDataTypeFolderByIdErrors, DeleteDataTypeFolderByIdResponses, DeleteDictionaryByIdData, DeleteDictionaryByIdErrors, DeleteDictionaryByIdResponses, DeleteDocumentBlueprintByIdData, DeleteDocumentBlueprintByIdErrors, DeleteDocumentBlueprintByIdResponses, DeleteDocumentBlueprintFolderByIdData, DeleteDocumentBlueprintFolderByIdErrors, DeleteDocumentBlueprintFolderByIdResponses, DeleteDocumentByIdData, DeleteDocumentByIdErrors, DeleteDocumentByIdPublicAccessData, DeleteDocumentByIdPublicAccessErrors, DeleteDocumentByIdPublicAccessResponses, DeleteDocumentByIdResponses, DeleteDocumentTypeByIdData, DeleteDocumentTypeByIdErrors, DeleteDocumentTypeByIdResponses, DeleteDocumentTypeFolderByIdData, DeleteDocumentTypeFolderByIdErrors, DeleteDocumentTypeFolderByIdResponses, DeleteLanguageByIsoCodeData, DeleteLanguageByIsoCodeErrors, DeleteLanguageByIsoCodeResponses, DeleteLogViewerSavedSearchByNameData, DeleteLogViewerSavedSearchByNameErrors, DeleteLogViewerSavedSearchByNameResponses, DeleteMediaByIdData, DeleteMediaByIdErrors, DeleteMediaByIdResponses, DeleteMediaTypeByIdData, DeleteMediaTypeByIdErrors, DeleteMediaTypeByIdResponses, DeleteMediaTypeFolderByIdData, DeleteMediaTypeFolderByIdErrors, DeleteMediaTypeFolderByIdResponses, DeleteMemberByIdData, DeleteMemberByIdErrors, DeleteMemberByIdResponses, DeleteMemberGroupByIdData, DeleteMemberGroupByIdErrors, DeleteMemberGroupByIdResponses, DeleteMemberTypeByIdData, DeleteMemberTypeByIdErrors, DeleteMemberTypeByIdResponses, DeleteMemberTypeFolderByIdData, DeleteMemberTypeFolderByIdErrors, DeleteMemberTypeFolderByIdResponses, DeletePackageCreatedByIdData, DeletePackageCreatedByIdErrors, DeletePackageCreatedByIdResponses, DeletePartialViewByPathData, DeletePartialViewByPathErrors, DeletePartialViewByPathResponses, DeletePartialViewFolderByPathData, DeletePartialViewFolderByPathErrors, DeletePartialViewFolderByPathResponses, DeletePreviewData, DeletePreviewResponses, DeleteRecycleBinDocumentByIdData, DeleteRecycleBinDocumentByIdErrors, DeleteRecycleBinDocumentByIdResponses, DeleteRecycleBinDocumentData, DeleteRecycleBinDocumentErrors, DeleteRecycleBinDocumentResponses, DeleteRecycleBinMediaByIdData, DeleteRecycleBinMediaByIdErrors, DeleteRecycleBinMediaByIdResponses, DeleteRecycleBinMediaData, DeleteRecycleBinMediaErrors, DeleteRecycleBinMediaResponses, DeleteRedirectManagementByIdData, DeleteRedirectManagementByIdErrors, DeleteRedirectManagementByIdResponses, DeleteScriptByPathData, DeleteScriptByPathErrors, DeleteScriptByPathResponses, DeleteScriptFolderByPathData, DeleteScriptFolderByPathErrors, DeleteScriptFolderByPathResponses, DeleteStylesheetByPathData, DeleteStylesheetByPathErrors, DeleteStylesheetByPathResponses, DeleteStylesheetFolderByPathData, DeleteStylesheetFolderByPathErrors, DeleteStylesheetFolderByPathResponses, DeleteTemplateByIdData, DeleteTemplateByIdErrors, DeleteTemplateByIdResponses, DeleteTemporaryFileByIdData, DeleteTemporaryFileByIdErrors, DeleteTemporaryFileByIdResponses, DeleteUserAvatarByIdData, DeleteUserAvatarByIdErrors, DeleteUserAvatarByIdResponses, DeleteUserById2FaByProviderNameData, DeleteUserById2FaByProviderNameErrors, DeleteUserById2FaByProviderNameResponses, DeleteUserByIdClientCredentialsByClientIdData, DeleteUserByIdClientCredentialsByClientIdErrors, DeleteUserByIdClientCredentialsByClientIdResponses, DeleteUserByIdData, DeleteUserByIdErrors, DeleteUserByIdResponses, DeleteUserCurrent2FaByProviderNameData, DeleteUserCurrent2FaByProviderNameErrors, DeleteUserCurrent2FaByProviderNameResponses, DeleteUserData, DeleteUserDataByIdData, DeleteUserDataByIdErrors, DeleteUserDataByIdResponses, DeleteUserErrors, DeleteUserGroupByIdData, DeleteUserGroupByIdErrors, DeleteUserGroupByIdResponses, DeleteUserGroupByIdUsersData, DeleteUserGroupByIdUsersErrors, DeleteUserGroupByIdUsersResponses, DeleteUserGroupData, DeleteUserGroupErrors, DeleteUserGroupResponses, DeleteUserResponses, DeleteWebhookByIdData, DeleteWebhookByIdErrors, DeleteWebhookByIdResponses, GetCollectionDocumentByIdData, GetCollectionDocumentByIdErrors, GetCollectionDocumentByIdResponses, GetCollectionMediaData, GetCollectionMediaErrors, GetCollectionMediaResponses, GetCultureData, GetCultureErrors, GetCultureResponses, GetDataTypeByIdData, GetDataTypeByIdErrors, GetDataTypeByIdIsUsedData, GetDataTypeByIdIsUsedErrors, GetDataTypeByIdIsUsedResponses, GetDataTypeByIdReferencedByData, GetDataTypeByIdReferencedByErrors, GetDataTypeByIdReferencedByResponses, GetDataTypeByIdResponses, GetDataTypeConfigurationData, GetDataTypeConfigurationErrors, GetDataTypeConfigurationResponses, GetDataTypeFolderByIdData, GetDataTypeFolderByIdErrors, GetDataTypeFolderByIdResponses, GetDictionaryByIdData, GetDictionaryByIdErrors, GetDictionaryByIdExportData, GetDictionaryByIdExportErrors, GetDictionaryByIdExportResponses, GetDictionaryByIdResponses, GetDictionaryData, GetDictionaryErrors, GetDictionaryResponses, GetDocumentAreReferencedData, GetDocumentAreReferencedErrors, GetDocumentAreReferencedResponses, GetDocumentBlueprintByIdData, GetDocumentBlueprintByIdErrors, GetDocumentBlueprintByIdResponses, GetDocumentBlueprintByIdScaffoldData, GetDocumentBlueprintByIdScaffoldErrors, GetDocumentBlueprintByIdScaffoldResponses, GetDocumentBlueprintFolderByIdData, GetDocumentBlueprintFolderByIdErrors, GetDocumentBlueprintFolderByIdResponses, GetDocumentByIdAuditLogData, GetDocumentByIdAuditLogErrors, GetDocumentByIdAuditLogResponses, GetDocumentByIdAvailableSegmentOptionsData, GetDocumentByIdAvailableSegmentOptionsErrors, GetDocumentByIdAvailableSegmentOptionsResponses, GetDocumentByIdData, GetDocumentByIdDomainsData, GetDocumentByIdDomainsErrors, GetDocumentByIdDomainsResponses, GetDocumentByIdErrors, GetDocumentByIdNotificationsData, GetDocumentByIdNotificationsErrors, GetDocumentByIdNotificationsResponses, GetDocumentByIdPreviewUrlData, GetDocumentByIdPreviewUrlErrors, GetDocumentByIdPreviewUrlResponses, GetDocumentByIdPublicAccessData, GetDocumentByIdPublicAccessErrors, GetDocumentByIdPublicAccessResponses, GetDocumentByIdPublishedData, GetDocumentByIdPublishedErrors, GetDocumentByIdPublishedResponses, GetDocumentByIdPublishWithDescendantsResultByTaskIdData, GetDocumentByIdPublishWithDescendantsResultByTaskIdErrors, GetDocumentByIdPublishWithDescendantsResultByTaskIdResponses, GetDocumentByIdReferencedByData, GetDocumentByIdReferencedByErrors, GetDocumentByIdReferencedByResponses, GetDocumentByIdReferencedDescendantsData, GetDocumentByIdReferencedDescendantsErrors, GetDocumentByIdReferencedDescendantsResponses, GetDocumentByIdResponses, GetDocumentConfigurationData, GetDocumentConfigurationErrors, GetDocumentConfigurationResponses, GetDocumentTypeAllowedAtRootData, GetDocumentTypeAllowedAtRootErrors, GetDocumentTypeAllowedAtRootResponses, GetDocumentTypeByIdAllowedChildrenData, GetDocumentTypeByIdAllowedChildrenErrors, GetDocumentTypeByIdAllowedChildrenResponses, GetDocumentTypeByIdBlueprintData, GetDocumentTypeByIdBlueprintErrors, GetDocumentTypeByIdBlueprintResponses, GetDocumentTypeByIdCompositionReferencesData, GetDocumentTypeByIdCompositionReferencesErrors, GetDocumentTypeByIdCompositionReferencesResponses, GetDocumentTypeByIdData, GetDocumentTypeByIdErrors, GetDocumentTypeByIdExportData, GetDocumentTypeByIdExportErrors, GetDocumentTypeByIdExportResponses, GetDocumentTypeByIdResponses, GetDocumentTypeConfigurationData, GetDocumentTypeConfigurationErrors, GetDocumentTypeConfigurationResponses, GetDocumentTypeFolderByIdData, GetDocumentTypeFolderByIdErrors, GetDocumentTypeFolderByIdResponses, GetDocumentUrlsData, GetDocumentUrlsErrors, GetDocumentUrlsResponses, GetDocumentVersionByIdData, GetDocumentVersionByIdErrors, GetDocumentVersionByIdResponses, GetDocumentVersionData, GetDocumentVersionErrors, GetDocumentVersionResponses, GetDynamicRootStepsData, GetDynamicRootStepsErrors, GetDynamicRootStepsResponses, GetFilterDataTypeData, GetFilterDataTypeErrors, GetFilterDataTypeResponses, GetFilterMemberData, GetFilterMemberErrors, GetFilterMemberResponses, GetFilterUserData, GetFilterUserErrors, GetFilterUserGroupData, GetFilterUserGroupErrors, GetFilterUserGroupResponses, GetFilterUserResponses, GetHealthCheckGroupByNameData, GetHealthCheckGroupByNameErrors, GetHealthCheckGroupByNameResponses, GetHealthCheckGroupData, GetHealthCheckGroupErrors, GetHealthCheckGroupResponses, GetHelpData, GetHelpErrors, GetHelpResponses, GetImagingResizeUrlsData, GetImagingResizeUrlsErrors, GetImagingResizeUrlsResponses, GetImportAnalyzeData, GetImportAnalyzeErrors, GetImportAnalyzeResponses, GetIndexerByIndexNameData, GetIndexerByIndexNameErrors, GetIndexerByIndexNameResponses, GetIndexerData, GetIndexerErrors, GetIndexerResponses, GetInstallSettingsData, GetInstallSettingsErrors, GetInstallSettingsResponses, GetItemDataTypeData, GetItemDataTypeErrors, GetItemDataTypeResponses, GetItemDataTypeSearchData, GetItemDataTypeSearchErrors, GetItemDataTypeSearchResponses, GetItemDictionaryData, GetItemDictionaryErrors, GetItemDictionaryResponses, GetItemDocumentBlueprintData, GetItemDocumentBlueprintErrors, GetItemDocumentBlueprintResponses, GetItemDocumentData, GetItemDocumentErrors, GetItemDocumentResponses, GetItemDocumentSearchData, GetItemDocumentSearchErrors, GetItemDocumentSearchResponses, GetItemDocumentTypeData, GetItemDocumentTypeErrors, GetItemDocumentTypeResponses, GetItemDocumentTypeSearchData, GetItemDocumentTypeSearchErrors, GetItemDocumentTypeSearchResponses, GetItemLanguageData, GetItemLanguageDefaultData, GetItemLanguageDefaultErrors, GetItemLanguageDefaultResponses, GetItemLanguageErrors, GetItemLanguageResponses, GetItemMediaData, GetItemMediaErrors, GetItemMediaResponses, GetItemMediaSearchData, GetItemMediaSearchErrors, GetItemMediaSearchResponses, GetItemMediaTypeAllowedData, GetItemMediaTypeAllowedErrors, GetItemMediaTypeAllowedResponses, GetItemMediaTypeData, GetItemMediaTypeErrors, GetItemMediaTypeFoldersData, GetItemMediaTypeFoldersErrors, GetItemMediaTypeFoldersResponses, GetItemMediaTypeResponses, GetItemMediaTypeSearchData, GetItemMediaTypeSearchErrors, GetItemMediaTypeSearchResponses, GetItemMemberData, GetItemMemberErrors, GetItemMemberGroupData, GetItemMemberGroupErrors, GetItemMemberGroupResponses, GetItemMemberResponses, GetItemMemberSearchData, GetItemMemberSearchErrors, GetItemMemberSearchResponses, GetItemMemberTypeData, GetItemMemberTypeErrors, GetItemMemberTypeResponses, GetItemMemberTypeSearchData, GetItemMemberTypeSearchErrors, GetItemMemberTypeSearchResponses, GetItemPartialViewData, GetItemPartialViewErrors, GetItemPartialViewResponses, GetItemRelationTypeData, GetItemRelationTypeErrors, GetItemRelationTypeResponses, GetItemScriptData, GetItemScriptErrors, GetItemScriptResponses, GetItemStaticFileData, GetItemStaticFileErrors, GetItemStaticFileResponses, GetItemStylesheetData, GetItemStylesheetErrors, GetItemStylesheetResponses, GetItemTemplateData, GetItemTemplateErrors, GetItemTemplateResponses, GetItemTemplateSearchData, GetItemTemplateSearchErrors, GetItemTemplateSearchResponses, GetItemUserData, GetItemUserErrors, GetItemUserGroupData, GetItemUserGroupErrors, GetItemUserGroupResponses, GetItemUserResponses, GetItemWebhookData, GetItemWebhookErrors, GetItemWebhookResponses, GetLanguageByIsoCodeData, GetLanguageByIsoCodeErrors, GetLanguageByIsoCodeResponses, GetLanguageData, GetLanguageErrors, GetLanguageResponses, GetLogViewerLevelCountData, GetLogViewerLevelCountErrors, GetLogViewerLevelCountResponses, GetLogViewerLevelData, GetLogViewerLevelErrors, GetLogViewerLevelResponses, GetLogViewerLogData, GetLogViewerLogErrors, GetLogViewerLogResponses, GetLogViewerMessageTemplateData, GetLogViewerMessageTemplateErrors, GetLogViewerMessageTemplateResponses, GetLogViewerSavedSearchByNameData, GetLogViewerSavedSearchByNameErrors, GetLogViewerSavedSearchByNameResponses, GetLogViewerSavedSearchData, GetLogViewerSavedSearchErrors, GetLogViewerSavedSearchResponses, GetLogViewerValidateLogsSizeData, GetLogViewerValidateLogsSizeErrors, GetLogViewerValidateLogsSizeResponses, GetManifestManifestData, GetManifestManifestErrors, GetManifestManifestPrivateData, GetManifestManifestPrivateErrors, GetManifestManifestPrivateResponses, GetManifestManifestPublicData, GetManifestManifestPublicResponses, GetManifestManifestResponses, GetMediaAreReferencedData, GetMediaAreReferencedErrors, GetMediaAreReferencedResponses, GetMediaByIdAuditLogData, GetMediaByIdAuditLogErrors, GetMediaByIdAuditLogResponses, GetMediaByIdData, GetMediaByIdErrors, GetMediaByIdReferencedByData, GetMediaByIdReferencedByErrors, GetMediaByIdReferencedByResponses, GetMediaByIdReferencedDescendantsData, GetMediaByIdReferencedDescendantsErrors, GetMediaByIdReferencedDescendantsResponses, GetMediaByIdResponses, GetMediaConfigurationData, GetMediaConfigurationErrors, GetMediaConfigurationResponses, GetMediaTypeAllowedAtRootData, GetMediaTypeAllowedAtRootErrors, GetMediaTypeAllowedAtRootResponses, GetMediaTypeByIdAllowedChildrenData, GetMediaTypeByIdAllowedChildrenErrors, GetMediaTypeByIdAllowedChildrenResponses, GetMediaTypeByIdCompositionReferencesData, GetMediaTypeByIdCompositionReferencesErrors, GetMediaTypeByIdCompositionReferencesResponses, GetMediaTypeByIdData, GetMediaTypeByIdErrors, GetMediaTypeByIdExportData, GetMediaTypeByIdExportErrors, GetMediaTypeByIdExportResponses, GetMediaTypeByIdResponses, GetMediaTypeConfigurationData, GetMediaTypeConfigurationErrors, GetMediaTypeConfigurationResponses, GetMediaTypeFolderByIdData, GetMediaTypeFolderByIdErrors, GetMediaTypeFolderByIdResponses, GetMediaUrlsData, GetMediaUrlsErrors, GetMediaUrlsResponses, GetMemberAreReferencedData, GetMemberAreReferencedErrors, GetMemberAreReferencedResponses, GetMemberByIdData, GetMemberByIdErrors, GetMemberByIdReferencedByData, GetMemberByIdReferencedByErrors, GetMemberByIdReferencedByResponses, GetMemberByIdReferencedDescendantsData, GetMemberByIdReferencedDescendantsErrors, GetMemberByIdReferencedDescendantsResponses, GetMemberByIdResponses, GetMemberConfigurationData, GetMemberConfigurationErrors, GetMemberConfigurationResponses, GetMemberGroupByIdData, GetMemberGroupByIdErrors, GetMemberGroupByIdResponses, GetMemberGroupData, GetMemberGroupErrors, GetMemberGroupResponses, GetMemberTypeByIdCompositionReferencesData, GetMemberTypeByIdCompositionReferencesErrors, GetMemberTypeByIdCompositionReferencesResponses, GetMemberTypeByIdData, GetMemberTypeByIdErrors, GetMemberTypeByIdExportData, GetMemberTypeByIdExportErrors, GetMemberTypeByIdExportResponses, GetMemberTypeByIdResponses, GetMemberTypeConfigurationData, GetMemberTypeConfigurationErrors, GetMemberTypeConfigurationResponses, GetMemberTypeFolderByIdData, GetMemberTypeFolderByIdErrors, GetMemberTypeFolderByIdResponses, GetModelsBuilderDashboardData, GetModelsBuilderDashboardErrors, GetModelsBuilderDashboardResponses, GetModelsBuilderStatusData, GetModelsBuilderStatusErrors, GetModelsBuilderStatusResponses, GetNewsDashboardData, GetNewsDashboardErrors, GetNewsDashboardResponses, GetObjectTypesData, GetObjectTypesErrors, GetObjectTypesResponses, GetOembedQueryData, GetOembedQueryErrors, GetOembedQueryResponses, GetPackageConfigurationData, GetPackageConfigurationErrors, GetPackageConfigurationResponses, GetPackageCreatedByIdData, GetPackageCreatedByIdDownloadData, GetPackageCreatedByIdDownloadErrors, GetPackageCreatedByIdDownloadResponses, GetPackageCreatedByIdErrors, GetPackageCreatedByIdResponses, GetPackageCreatedData, GetPackageCreatedErrors, GetPackageCreatedResponses, GetPackageMigrationStatusData, GetPackageMigrationStatusErrors, GetPackageMigrationStatusResponses, GetPartialViewByPathData, GetPartialViewByPathErrors, GetPartialViewByPathResponses, GetPartialViewFolderByPathData, GetPartialViewFolderByPathErrors, GetPartialViewFolderByPathResponses, GetPartialViewSnippetByIdData, GetPartialViewSnippetByIdErrors, GetPartialViewSnippetByIdResponses, GetPartialViewSnippetData, GetPartialViewSnippetErrors, GetPartialViewSnippetResponses, GetProfilingStatusData, GetProfilingStatusErrors, GetProfilingStatusResponses, GetPropertyTypeIsUsedData, GetPropertyTypeIsUsedErrors, GetPropertyTypeIsUsedResponses, GetPublishedCacheRebuildStatusData, GetPublishedCacheRebuildStatusErrors, GetPublishedCacheRebuildStatusResponses, GetRecycleBinDocumentByIdOriginalParentData, GetRecycleBinDocumentByIdOriginalParentErrors, GetRecycleBinDocumentByIdOriginalParentResponses, GetRecycleBinDocumentChildrenData, GetRecycleBinDocumentChildrenErrors, GetRecycleBinDocumentChildrenResponses, GetRecycleBinDocumentReferencedByData, GetRecycleBinDocumentReferencedByErrors, GetRecycleBinDocumentReferencedByResponses, GetRecycleBinDocumentRootData, GetRecycleBinDocumentRootErrors, GetRecycleBinDocumentRootResponses, GetRecycleBinDocumentSiblingsData, GetRecycleBinDocumentSiblingsErrors, GetRecycleBinDocumentSiblingsResponses, GetRecycleBinMediaByIdOriginalParentData, GetRecycleBinMediaByIdOriginalParentErrors, GetRecycleBinMediaByIdOriginalParentResponses, GetRecycleBinMediaChildrenData, GetRecycleBinMediaChildrenErrors, GetRecycleBinMediaChildrenResponses, GetRecycleBinMediaReferencedByData, GetRecycleBinMediaReferencedByErrors, GetRecycleBinMediaReferencedByResponses, GetRecycleBinMediaRootData, GetRecycleBinMediaRootErrors, GetRecycleBinMediaRootResponses, GetRecycleBinMediaSiblingsData, GetRecycleBinMediaSiblingsErrors, GetRecycleBinMediaSiblingsResponses, GetRedirectManagementByIdData, GetRedirectManagementByIdErrors, GetRedirectManagementByIdResponses, GetRedirectManagementData, GetRedirectManagementErrors, GetRedirectManagementResponses, GetRedirectManagementStatusData, GetRedirectManagementStatusErrors, GetRedirectManagementStatusResponses, GetRelationByRelationTypeIdData, GetRelationByRelationTypeIdErrors, GetRelationByRelationTypeIdResponses, GetRelationTypeByIdData, GetRelationTypeByIdErrors, GetRelationTypeByIdResponses, GetRelationTypeData, GetRelationTypeErrors, GetRelationTypeResponses, GetScriptByPathData, GetScriptByPathErrors, GetScriptByPathResponses, GetScriptFolderByPathData, GetScriptFolderByPathErrors, GetScriptFolderByPathResponses, GetSearcherBySearcherNameQueryData, GetSearcherBySearcherNameQueryErrors, GetSearcherBySearcherNameQueryResponses, GetSearcherData, GetSearcherErrors, GetSearcherResponses, GetSecurityConfigurationData, GetSecurityConfigurationErrors, GetSecurityConfigurationResponses, GetSegmentData, GetSegmentErrors, GetSegmentResponses, GetServerConfigurationData, GetServerConfigurationResponses, GetServerInformationData, GetServerInformationErrors, GetServerInformationResponses, GetServerStatusData, GetServerStatusErrors, GetServerStatusResponses, GetServerTroubleshootingData, GetServerTroubleshootingErrors, GetServerTroubleshootingResponses, GetServerUpgradeCheckData, GetServerUpgradeCheckErrors, GetServerUpgradeCheckResponses, GetStylesheetByPathData, GetStylesheetByPathErrors, GetStylesheetByPathResponses, GetStylesheetFolderByPathData, GetStylesheetFolderByPathErrors, GetStylesheetFolderByPathResponses, GetTagData, GetTagErrors, GetTagResponses, GetTelemetryData, GetTelemetryErrors, GetTelemetryLevelData, GetTelemetryLevelErrors, GetTelemetryLevelResponses, GetTelemetryResponses, GetTemplateByIdData, GetTemplateByIdErrors, GetTemplateByIdResponses, GetTemplateConfigurationData, GetTemplateConfigurationErrors, GetTemplateConfigurationResponses, GetTemplateQuerySettingsData, GetTemplateQuerySettingsErrors, GetTemplateQuerySettingsResponses, GetTemporaryFileByIdData, GetTemporaryFileByIdErrors, GetTemporaryFileByIdResponses, GetTemporaryFileConfigurationData, GetTemporaryFileConfigurationErrors, GetTemporaryFileConfigurationResponses, GetTreeDataTypeAncestorsData, GetTreeDataTypeAncestorsErrors, GetTreeDataTypeAncestorsResponses, GetTreeDataTypeChildrenData, GetTreeDataTypeChildrenErrors, GetTreeDataTypeChildrenResponses, GetTreeDataTypeRootData, GetTreeDataTypeRootErrors, GetTreeDataTypeRootResponses, GetTreeDataTypeSiblingsData, GetTreeDataTypeSiblingsErrors, GetTreeDataTypeSiblingsResponses, GetTreeDictionaryAncestorsData, GetTreeDictionaryAncestorsErrors, GetTreeDictionaryAncestorsResponses, GetTreeDictionaryChildrenData, GetTreeDictionaryChildrenErrors, GetTreeDictionaryChildrenResponses, GetTreeDictionaryRootData, GetTreeDictionaryRootErrors, GetTreeDictionaryRootResponses, GetTreeDocumentAncestorsData, GetTreeDocumentAncestorsErrors, GetTreeDocumentAncestorsResponses, GetTreeDocumentBlueprintAncestorsData, GetTreeDocumentBlueprintAncestorsErrors, GetTreeDocumentBlueprintAncestorsResponses, GetTreeDocumentBlueprintChildrenData, GetTreeDocumentBlueprintChildrenErrors, GetTreeDocumentBlueprintChildrenResponses, GetTreeDocumentBlueprintRootData, GetTreeDocumentBlueprintRootErrors, GetTreeDocumentBlueprintRootResponses, GetTreeDocumentBlueprintSiblingsData, GetTreeDocumentBlueprintSiblingsErrors, GetTreeDocumentBlueprintSiblingsResponses, GetTreeDocumentChildrenData, GetTreeDocumentChildrenErrors, GetTreeDocumentChildrenResponses, GetTreeDocumentRootData, GetTreeDocumentRootErrors, GetTreeDocumentRootResponses, GetTreeDocumentSiblingsData, GetTreeDocumentSiblingsErrors, GetTreeDocumentSiblingsResponses, GetTreeDocumentTypeAncestorsData, GetTreeDocumentTypeAncestorsErrors, GetTreeDocumentTypeAncestorsResponses, GetTreeDocumentTypeChildrenData, GetTreeDocumentTypeChildrenErrors, GetTreeDocumentTypeChildrenResponses, GetTreeDocumentTypeRootData, GetTreeDocumentTypeRootErrors, GetTreeDocumentTypeRootResponses, GetTreeDocumentTypeSiblingsData, GetTreeDocumentTypeSiblingsErrors, GetTreeDocumentTypeSiblingsResponses, GetTreeMediaAncestorsData, GetTreeMediaAncestorsErrors, GetTreeMediaAncestorsResponses, GetTreeMediaChildrenData, GetTreeMediaChildrenErrors, GetTreeMediaChildrenResponses, GetTreeMediaRootData, GetTreeMediaRootErrors, GetTreeMediaRootResponses, GetTreeMediaSiblingsData, GetTreeMediaSiblingsErrors, GetTreeMediaSiblingsResponses, GetTreeMediaTypeAncestorsData, GetTreeMediaTypeAncestorsErrors, GetTreeMediaTypeAncestorsResponses, GetTreeMediaTypeChildrenData, GetTreeMediaTypeChildrenErrors, GetTreeMediaTypeChildrenResponses, GetTreeMediaTypeRootData, GetTreeMediaTypeRootErrors, GetTreeMediaTypeRootResponses, GetTreeMediaTypeSiblingsData, GetTreeMediaTypeSiblingsErrors, GetTreeMediaTypeSiblingsResponses, GetTreeMemberGroupRootData, GetTreeMemberGroupRootErrors, GetTreeMemberGroupRootResponses, GetTreeMemberTypeAncestorsData, GetTreeMemberTypeAncestorsErrors, GetTreeMemberTypeAncestorsResponses, GetTreeMemberTypeChildrenData, GetTreeMemberTypeChildrenErrors, GetTreeMemberTypeChildrenResponses, GetTreeMemberTypeRootData, GetTreeMemberTypeRootErrors, GetTreeMemberTypeRootResponses, GetTreeMemberTypeSiblingsData, GetTreeMemberTypeSiblingsErrors, GetTreeMemberTypeSiblingsResponses, GetTreePartialViewAncestorsData, GetTreePartialViewAncestorsErrors, GetTreePartialViewAncestorsResponses, GetTreePartialViewChildrenData, GetTreePartialViewChildrenErrors, GetTreePartialViewChildrenResponses, GetTreePartialViewRootData, GetTreePartialViewRootErrors, GetTreePartialViewRootResponses, GetTreePartialViewSiblingsData, GetTreePartialViewSiblingsErrors, GetTreePartialViewSiblingsResponses, GetTreeScriptAncestorsData, GetTreeScriptAncestorsErrors, GetTreeScriptAncestorsResponses, GetTreeScriptChildrenData, GetTreeScriptChildrenErrors, GetTreeScriptChildrenResponses, GetTreeScriptRootData, GetTreeScriptRootErrors, GetTreeScriptRootResponses, GetTreeScriptSiblingsData, GetTreeScriptSiblingsErrors, GetTreeScriptSiblingsResponses, GetTreeStaticFileAncestorsData, GetTreeStaticFileAncestorsErrors, GetTreeStaticFileAncestorsResponses, GetTreeStaticFileChildrenData, GetTreeStaticFileChildrenErrors, GetTreeStaticFileChildrenResponses, GetTreeStaticFileRootData, GetTreeStaticFileRootErrors, GetTreeStaticFileRootResponses, GetTreeStylesheetAncestorsData, GetTreeStylesheetAncestorsErrors, GetTreeStylesheetAncestorsResponses, GetTreeStylesheetChildrenData, GetTreeStylesheetChildrenErrors, GetTreeStylesheetChildrenResponses, GetTreeStylesheetRootData, GetTreeStylesheetRootErrors, GetTreeStylesheetRootResponses, GetTreeStylesheetSiblingsData, GetTreeStylesheetSiblingsErrors, GetTreeStylesheetSiblingsResponses, GetTreeTemplateAncestorsData, GetTreeTemplateAncestorsErrors, GetTreeTemplateAncestorsResponses, GetTreeTemplateChildrenData, GetTreeTemplateChildrenErrors, GetTreeTemplateChildrenResponses, GetTreeTemplateRootData, GetTreeTemplateRootErrors, GetTreeTemplateRootResponses, GetTreeTemplateSiblingsData, GetTreeTemplateSiblingsErrors, GetTreeTemplateSiblingsResponses, GetUpgradeSettingsData, GetUpgradeSettingsErrors, GetUpgradeSettingsResponses, GetUserById2FaData, GetUserById2FaErrors, GetUserById2FaResponses, GetUserByIdCalculateStartNodesData, GetUserByIdCalculateStartNodesErrors, GetUserByIdCalculateStartNodesResponses, GetUserByIdClientCredentialsData, GetUserByIdClientCredentialsErrors, GetUserByIdClientCredentialsResponses, GetUserByIdData, GetUserByIdErrors, GetUserByIdResponses, GetUserConfigurationData, GetUserConfigurationErrors, GetUserConfigurationResponses, GetUserCurrent2FaByProviderNameData, GetUserCurrent2FaByProviderNameErrors, GetUserCurrent2FaByProviderNameResponses, GetUserCurrent2FaData, GetUserCurrent2FaErrors, GetUserCurrent2FaResponses, GetUserCurrentConfigurationData, GetUserCurrentConfigurationErrors, GetUserCurrentConfigurationResponses, GetUserCurrentData, GetUserCurrentErrors, GetUserCurrentLoginProvidersData, GetUserCurrentLoginProvidersErrors, GetUserCurrentLoginProvidersResponses, GetUserCurrentPermissionsData, GetUserCurrentPermissionsDocumentData, GetUserCurrentPermissionsDocumentErrors, GetUserCurrentPermissionsDocumentResponses, GetUserCurrentPermissionsErrors, GetUserCurrentPermissionsMediaData, GetUserCurrentPermissionsMediaErrors, GetUserCurrentPermissionsMediaResponses, GetUserCurrentPermissionsResponses, GetUserCurrentResponses, GetUserData, GetUserDataByIdData, GetUserDataByIdErrors, GetUserDataByIdResponses, GetUserDataData, GetUserDataErrors, GetUserDataResponses, GetUserErrors, GetUserGroupByIdData, GetUserGroupByIdErrors, GetUserGroupByIdResponses, GetUserGroupData, GetUserGroupErrors, GetUserGroupResponses, GetUserResponses, GetWebhookByIdData, GetWebhookByIdErrors, GetWebhookByIdLogsData, GetWebhookByIdLogsErrors, GetWebhookByIdLogsResponses, GetWebhookByIdResponses, GetWebhookData, GetWebhookErrors, GetWebhookEventsData, GetWebhookEventsErrors, GetWebhookEventsResponses, GetWebhookLogsData, GetWebhookLogsErrors, GetWebhookLogsResponses, GetWebhookResponses, PostDataTypeByIdCopyData, PostDataTypeByIdCopyErrors, PostDataTypeByIdCopyResponses, PostDataTypeData, PostDataTypeErrors, PostDataTypeFolderData, PostDataTypeFolderErrors, PostDataTypeFolderResponses, PostDataTypeResponses, PostDictionaryData, PostDictionaryErrors, PostDictionaryImportData, PostDictionaryImportErrors, PostDictionaryImportResponses, PostDictionaryResponses, PostDocumentBlueprintData, PostDocumentBlueprintErrors, PostDocumentBlueprintFolderData, PostDocumentBlueprintFolderErrors, PostDocumentBlueprintFolderResponses, PostDocumentBlueprintFromDocumentData, PostDocumentBlueprintFromDocumentErrors, PostDocumentBlueprintFromDocumentResponses, PostDocumentBlueprintResponses, PostDocumentByIdCopyData, PostDocumentByIdCopyErrors, PostDocumentByIdCopyResponses, PostDocumentByIdPublicAccessData, PostDocumentByIdPublicAccessErrors, PostDocumentByIdPublicAccessResponses, PostDocumentData, PostDocumentErrors, PostDocumentResponses, PostDocumentTypeAvailableCompositionsData, PostDocumentTypeAvailableCompositionsErrors, PostDocumentTypeAvailableCompositionsResponses, PostDocumentTypeByIdCopyData, PostDocumentTypeByIdCopyErrors, PostDocumentTypeByIdCopyResponses, PostDocumentTypeData, PostDocumentTypeErrors, PostDocumentTypeFolderData, PostDocumentTypeFolderErrors, PostDocumentTypeFolderResponses, PostDocumentTypeImportData, PostDocumentTypeImportErrors, PostDocumentTypeImportResponses, PostDocumentTypeResponses, PostDocumentValidateData, PostDocumentValidateErrors, PostDocumentValidateResponses, PostDocumentVersionByIdRollbackData, PostDocumentVersionByIdRollbackErrors, PostDocumentVersionByIdRollbackResponses, PostDynamicRootQueryData, PostDynamicRootQueryErrors, PostDynamicRootQueryResponses, PostHealthCheckExecuteActionData, PostHealthCheckExecuteActionErrors, PostHealthCheckExecuteActionResponses, PostHealthCheckGroupByNameCheckData, PostHealthCheckGroupByNameCheckErrors, PostHealthCheckGroupByNameCheckResponses, PostIndexerByIndexNameRebuildData, PostIndexerByIndexNameRebuildErrors, PostIndexerByIndexNameRebuildResponses, PostInstallSetupData, PostInstallSetupErrors, PostInstallSetupResponses, PostInstallValidateDatabaseData, PostInstallValidateDatabaseErrors, PostInstallValidateDatabaseResponses, PostLanguageData, PostLanguageErrors, PostLanguageResponses, PostLogViewerSavedSearchData, PostLogViewerSavedSearchErrors, PostLogViewerSavedSearchResponses, PostMediaData, PostMediaErrors, PostMediaResponses, PostMediaTypeAvailableCompositionsData, PostMediaTypeAvailableCompositionsErrors, PostMediaTypeAvailableCompositionsResponses, PostMediaTypeByIdCopyData, PostMediaTypeByIdCopyErrors, PostMediaTypeByIdCopyResponses, PostMediaTypeData, PostMediaTypeErrors, PostMediaTypeFolderData, PostMediaTypeFolderErrors, PostMediaTypeFolderResponses, PostMediaTypeImportData, PostMediaTypeImportErrors, PostMediaTypeImportResponses, PostMediaTypeResponses, PostMediaValidateData, PostMediaValidateErrors, PostMediaValidateResponses, PostMemberData, PostMemberErrors, PostMemberGroupData, PostMemberGroupErrors, PostMemberGroupResponses, PostMemberResponses, PostMemberTypeAvailableCompositionsData, PostMemberTypeAvailableCompositionsErrors, PostMemberTypeAvailableCompositionsResponses, PostMemberTypeByIdCopyData, PostMemberTypeByIdCopyErrors, PostMemberTypeByIdCopyResponses, PostMemberTypeData, PostMemberTypeErrors, PostMemberTypeFolderData, PostMemberTypeFolderErrors, PostMemberTypeFolderResponses, PostMemberTypeImportData, PostMemberTypeImportErrors, PostMemberTypeImportResponses, PostMemberTypeResponses, PostMemberValidateData, PostMemberValidateErrors, PostMemberValidateResponses, PostModelsBuilderBuildData, PostModelsBuilderBuildErrors, PostModelsBuilderBuildResponses, PostPackageByNameRunMigrationData, PostPackageByNameRunMigrationErrors, PostPackageByNameRunMigrationResponses, PostPackageCreatedData, PostPackageCreatedErrors, PostPackageCreatedResponses, PostPartialViewData, PostPartialViewErrors, PostPartialViewFolderData, PostPartialViewFolderErrors, PostPartialViewFolderResponses, PostPartialViewResponses, PostPreviewData, PostPreviewErrors, PostPreviewResponses, PostPublishedCacheRebuildData, PostPublishedCacheRebuildErrors, PostPublishedCacheRebuildResponses, PostPublishedCacheReloadData, PostPublishedCacheReloadErrors, PostPublishedCacheReloadResponses, PostRedirectManagementStatusData, PostRedirectManagementStatusErrors, PostRedirectManagementStatusResponses, PostScriptData, PostScriptErrors, PostScriptFolderData, PostScriptFolderErrors, PostScriptFolderResponses, PostScriptResponses, PostSecurityForgotPasswordData, PostSecurityForgotPasswordErrors, PostSecurityForgotPasswordResetData, PostSecurityForgotPasswordResetErrors, PostSecurityForgotPasswordResetResponses, PostSecurityForgotPasswordResponses, PostSecurityForgotPasswordVerifyData, PostSecurityForgotPasswordVerifyErrors, PostSecurityForgotPasswordVerifyResponses, PostStylesheetData, PostStylesheetErrors, PostStylesheetFolderData, PostStylesheetFolderErrors, PostStylesheetFolderResponses, PostStylesheetResponses, PostTelemetryLevelData, PostTelemetryLevelErrors, PostTelemetryLevelResponses, PostTemplateData, PostTemplateErrors, PostTemplateQueryExecuteData, PostTemplateQueryExecuteErrors, PostTemplateQueryExecuteResponses, PostTemplateResponses, PostTemporaryFileData, PostTemporaryFileErrors, PostTemporaryFileResponses, PostUpgradeAuthorizeData, PostUpgradeAuthorizeErrors, PostUpgradeAuthorizeResponses, PostUserAvatarByIdData, PostUserAvatarByIdErrors, PostUserAvatarByIdResponses, PostUserByIdChangePasswordData, PostUserByIdChangePasswordErrors, PostUserByIdChangePasswordResponses, PostUserByIdClientCredentialsData, PostUserByIdClientCredentialsErrors, PostUserByIdClientCredentialsResponses, PostUserByIdResetPasswordData, PostUserByIdResetPasswordErrors, PostUserByIdResetPasswordResponses, PostUserCurrent2FaByProviderNameData, PostUserCurrent2FaByProviderNameErrors, PostUserCurrent2FaByProviderNameResponses, PostUserCurrentAvatarData, PostUserCurrentAvatarErrors, PostUserCurrentAvatarResponses, PostUserCurrentChangePasswordData, PostUserCurrentChangePasswordErrors, PostUserCurrentChangePasswordResponses, PostUserData, PostUserDataData, PostUserDataErrors, PostUserDataResponses, PostUserDisableData, PostUserDisableErrors, PostUserDisableResponses, PostUserEnableData, PostUserEnableErrors, PostUserEnableResponses, PostUserErrors, PostUserGroupByIdUsersData, PostUserGroupByIdUsersErrors, PostUserGroupByIdUsersResponses, PostUserGroupData, PostUserGroupErrors, PostUserGroupResponses, PostUserInviteCreatePasswordData, PostUserInviteCreatePasswordErrors, PostUserInviteCreatePasswordResponses, PostUserInviteData, PostUserInviteErrors, PostUserInviteResendData, PostUserInviteResendErrors, PostUserInviteResendResponses, PostUserInviteResponses, PostUserInviteVerifyData, PostUserInviteVerifyErrors, PostUserInviteVerifyResponses, PostUserResponses, PostUserSetUserGroupsData, PostUserSetUserGroupsErrors, PostUserSetUserGroupsResponses, PostUserUnlockData, PostUserUnlockErrors, PostUserUnlockResponses, PostWebhookData, PostWebhookErrors, PostWebhookResponses, PutDataTypeByIdData, PutDataTypeByIdErrors, PutDataTypeByIdMoveData, PutDataTypeByIdMoveErrors, PutDataTypeByIdMoveResponses, PutDataTypeByIdResponses, PutDataTypeFolderByIdData, PutDataTypeFolderByIdErrors, PutDataTypeFolderByIdResponses, PutDictionaryByIdData, PutDictionaryByIdErrors, PutDictionaryByIdMoveData, PutDictionaryByIdMoveErrors, PutDictionaryByIdMoveResponses, PutDictionaryByIdResponses, PutDocumentBlueprintByIdData, PutDocumentBlueprintByIdErrors, PutDocumentBlueprintByIdMoveData, PutDocumentBlueprintByIdMoveErrors, PutDocumentBlueprintByIdMoveResponses, PutDocumentBlueprintByIdResponses, PutDocumentBlueprintFolderByIdData, PutDocumentBlueprintFolderByIdErrors, PutDocumentBlueprintFolderByIdResponses, PutDocumentByIdData, PutDocumentByIdDomainsData, PutDocumentByIdDomainsErrors, PutDocumentByIdDomainsResponses, PutDocumentByIdErrors, PutDocumentByIdMoveData, PutDocumentByIdMoveErrors, PutDocumentByIdMoveResponses, PutDocumentByIdMoveToRecycleBinData, PutDocumentByIdMoveToRecycleBinErrors, PutDocumentByIdMoveToRecycleBinResponses, PutDocumentByIdNotificationsData, PutDocumentByIdNotificationsErrors, PutDocumentByIdNotificationsResponses, PutDocumentByIdPublicAccessData, PutDocumentByIdPublicAccessErrors, PutDocumentByIdPublicAccessResponses, PutDocumentByIdPublishData, PutDocumentByIdPublishErrors, PutDocumentByIdPublishResponses, PutDocumentByIdPublishWithDescendantsData, PutDocumentByIdPublishWithDescendantsErrors, PutDocumentByIdPublishWithDescendantsResponses, PutDocumentByIdResponses, PutDocumentByIdUnpublishData, PutDocumentByIdUnpublishErrors, PutDocumentByIdUnpublishResponses, PutDocumentSortData, PutDocumentSortErrors, PutDocumentSortResponses, PutDocumentTypeByIdData, PutDocumentTypeByIdErrors, PutDocumentTypeByIdImportData, PutDocumentTypeByIdImportErrors, PutDocumentTypeByIdImportResponses, PutDocumentTypeByIdMoveData, PutDocumentTypeByIdMoveErrors, PutDocumentTypeByIdMoveResponses, PutDocumentTypeByIdResponses, PutDocumentTypeFolderByIdData, PutDocumentTypeFolderByIdErrors, PutDocumentTypeFolderByIdResponses, PutDocumentVersionByIdPreventCleanupData, PutDocumentVersionByIdPreventCleanupErrors, PutDocumentVersionByIdPreventCleanupResponses, PutLanguageByIsoCodeData, PutLanguageByIsoCodeErrors, PutLanguageByIsoCodeResponses, PutMediaByIdData, PutMediaByIdErrors, PutMediaByIdMoveData, PutMediaByIdMoveErrors, PutMediaByIdMoveResponses, PutMediaByIdMoveToRecycleBinData, PutMediaByIdMoveToRecycleBinErrors, PutMediaByIdMoveToRecycleBinResponses, PutMediaByIdResponses, PutMediaByIdValidateData, PutMediaByIdValidateErrors, PutMediaByIdValidateResponses, PutMediaSortData, PutMediaSortErrors, PutMediaSortResponses, PutMediaTypeByIdData, PutMediaTypeByIdErrors, PutMediaTypeByIdImportData, PutMediaTypeByIdImportErrors, PutMediaTypeByIdImportResponses, PutMediaTypeByIdMoveData, PutMediaTypeByIdMoveErrors, PutMediaTypeByIdMoveResponses, PutMediaTypeByIdResponses, PutMediaTypeFolderByIdData, PutMediaTypeFolderByIdErrors, PutMediaTypeFolderByIdResponses, PutMemberByIdData, PutMemberByIdErrors, PutMemberByIdResponses, PutMemberByIdValidateData, PutMemberByIdValidateErrors, PutMemberByIdValidateResponses, PutMemberGroupByIdData, PutMemberGroupByIdErrors, PutMemberGroupByIdResponses, PutMemberTypeByIdData, PutMemberTypeByIdErrors, PutMemberTypeByIdImportData, PutMemberTypeByIdImportErrors, PutMemberTypeByIdImportResponses, PutMemberTypeByIdMoveData, PutMemberTypeByIdMoveErrors, PutMemberTypeByIdMoveResponses, PutMemberTypeByIdResponses, PutMemberTypeFolderByIdData, PutMemberTypeFolderByIdErrors, PutMemberTypeFolderByIdResponses, PutPackageCreatedByIdData, PutPackageCreatedByIdErrors, PutPackageCreatedByIdResponses, PutPartialViewByPathData, PutPartialViewByPathErrors, PutPartialViewByPathRenameData, PutPartialViewByPathRenameErrors, PutPartialViewByPathRenameResponses, PutPartialViewByPathResponses, PutProfilingStatusData, PutProfilingStatusErrors, PutProfilingStatusResponses, PutRecycleBinDocumentByIdRestoreData, PutRecycleBinDocumentByIdRestoreErrors, PutRecycleBinDocumentByIdRestoreResponses, PutRecycleBinMediaByIdRestoreData, PutRecycleBinMediaByIdRestoreErrors, PutRecycleBinMediaByIdRestoreResponses, PutScriptByPathData, PutScriptByPathErrors, PutScriptByPathRenameData, PutScriptByPathRenameErrors, PutScriptByPathRenameResponses, PutScriptByPathResponses, PutStylesheetByPathData, PutStylesheetByPathErrors, PutStylesheetByPathRenameData, PutStylesheetByPathRenameErrors, PutStylesheetByPathRenameResponses, PutStylesheetByPathResponses, PutTemplateByIdData, PutTemplateByIdErrors, PutTemplateByIdResponses, PutUmbracoManagementApiV11DocumentByIdValidate11Data, PutUmbracoManagementApiV11DocumentByIdValidate11Errors, PutUmbracoManagementApiV11DocumentByIdValidate11Responses, PutUserByIdData, PutUserByIdErrors, PutUserByIdResponses, PutUserDataData, PutUserDataErrors, PutUserDataResponses, PutUserGroupByIdData, PutUserGroupByIdErrors, PutUserGroupByIdResponses, PutWebhookByIdData, PutWebhookByIdErrors, PutWebhookByIdResponses } from './types.gen'; export type Options = Options2 & { /** @@ -1905,6 +1905,9 @@ export class HealthCheckService { } export class HelpService { + /** + * @deprecated + */ public static getHelp(options?: Options) { return (options?.client ?? client).get({ security: [ @@ -3289,10 +3292,61 @@ export class MemberTypeService { } ], url: '/umbraco/management/api/v1/member-type/{id}/copy', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } + }); + } + + public static getMemberTypeByIdExport(options: Options) { + return (options.client ?? client).get({ + security: [ + { + scheme: 'bearer', + type: 'http' + } + ], + url: '/umbraco/management/api/v1/member-type/{id}/export', ...options }); } + public static putMemberTypeByIdImport(options: Options) { + return (options.client ?? client).put({ + security: [ + { + scheme: 'bearer', + type: 'http' + } + ], + url: '/umbraco/management/api/v1/member-type/{id}/import', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } + }); + } + + public static putMemberTypeByIdMove(options: Options) { + return (options.client ?? client).put({ + security: [ + { + scheme: 'bearer', + type: 'http' + } + ], + url: '/umbraco/management/api/v1/member-type/{id}/move', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } + }); + } + public static postMemberTypeAvailableCompositions(options?: Options) { return (options?.client ?? client).post({ security: [ @@ -3383,6 +3437,49 @@ export class MemberTypeService { }); } + public static postMemberTypeImport(options?: Options) { + return (options?.client ?? client).post({ + security: [ + { + scheme: 'bearer', + type: 'http' + } + ], + url: '/umbraco/management/api/v1/member-type/import', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers + } + }); + } + + public static getTreeMemberTypeAncestors(options?: Options) { + return (options?.client ?? client).get({ + security: [ + { + scheme: 'bearer', + type: 'http' + } + ], + url: '/umbraco/management/api/v1/tree/member-type/ancestors', + ...options + }); + } + + public static getTreeMemberTypeChildren(options?: Options) { + return (options?.client ?? client).get({ + security: [ + { + scheme: 'bearer', + type: 'http' + } + ], + url: '/umbraco/management/api/v1/tree/member-type/children', + ...options + }); + } + public static getTreeMemberTypeRoot(options?: Options) { return (options?.client ?? client).get({ security: [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/backend-api/types.gen.ts b/src/Umbraco.Web.UI.Client/src/packages/core/backend-api/types.gen.ts index 9ea9d69e5616..d919afff0d69 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/backend-api/types.gen.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/backend-api/types.gen.ts @@ -122,6 +122,10 @@ export type CopyMediaTypeRequestModel = { target?: ReferenceByIdModel | null; }; +export type CopyMemberTypeRequestModel = { + target?: ReferenceByIdModel | null; +}; + export type CreateDataTypeRequestModel = { name: string; editorAlias: string; @@ -327,6 +331,7 @@ export type CreateMemberTypeRequestModel = { properties: Array; containers: Array; id?: string | null; + parent?: ReferenceByIdModel | null; compositions: Array; }; @@ -1110,6 +1115,10 @@ export type ImportMediaTypeRequestModel = { file: ReferenceByIdModel; }; +export type ImportMemberTypeRequestModel = { + file: ReferenceByIdModel; +}; + export type IndexResponseModel = { name: string; healthStatus: HealthStatusResponseModel; @@ -1566,6 +1575,7 @@ export type MemberTypeTreeItemResponseModel = { parent?: ReferenceByIdModel | null; flags: Array; name: string; + isFolder: boolean; icon: string; }; @@ -1636,6 +1646,10 @@ export type MoveMediaTypeRequestModel = { target?: ReferenceByIdModel | null; }; +export type MoveMemberTypeRequestModel = { + target?: ReferenceByIdModel | null; +}; + export type NamedEntityTreeItemResponseModel = { hasChildren: boolean; id: string; @@ -10718,7 +10732,7 @@ export type GetMemberTypeByIdCompositionReferencesResponses = { export type GetMemberTypeByIdCompositionReferencesResponse = GetMemberTypeByIdCompositionReferencesResponses[keyof GetMemberTypeByIdCompositionReferencesResponses]; export type PostMemberTypeByIdCopyData = { - body?: never; + body?: CopyMemberTypeRequestModel; path: { id: string; }; @@ -10754,6 +10768,115 @@ export type PostMemberTypeByIdCopyResponses = { 201: unknown; }; +export type GetMemberTypeByIdExportData = { + body?: never; + path: { + id: string; + }; + query?: never; + url: '/umbraco/management/api/v1/member-type/{id}/export'; +}; + +export type GetMemberTypeByIdExportErrors = { + /** + * The resource is protected and requires an authentication token + */ + 401: unknown; + /** + * The authenticated user does not have access to this resource + */ + 403: unknown; + /** + * Not Found + */ + 404: ProblemDetails; +}; + +export type GetMemberTypeByIdExportError = GetMemberTypeByIdExportErrors[keyof GetMemberTypeByIdExportErrors]; + +export type GetMemberTypeByIdExportResponses = { + /** + * OK + */ + 200: Blob | File; +}; + +export type GetMemberTypeByIdExportResponse = GetMemberTypeByIdExportResponses[keyof GetMemberTypeByIdExportResponses]; + +export type PutMemberTypeByIdImportData = { + body?: ImportMemberTypeRequestModel; + path: { + id: string; + }; + query?: never; + url: '/umbraco/management/api/v1/member-type/{id}/import'; +}; + +export type PutMemberTypeByIdImportErrors = { + /** + * Bad Request + */ + 400: ProblemDetails; + /** + * The resource is protected and requires an authentication token + */ + 401: unknown; + /** + * The authenticated user does not have access to this resource + */ + 403: unknown; + /** + * Not Found + */ + 404: ProblemDetails; +}; + +export type PutMemberTypeByIdImportError = PutMemberTypeByIdImportErrors[keyof PutMemberTypeByIdImportErrors]; + +export type PutMemberTypeByIdImportResponses = { + /** + * OK + */ + 200: unknown; +}; + +export type PutMemberTypeByIdMoveData = { + body?: MoveMemberTypeRequestModel; + path: { + id: string; + }; + query?: never; + url: '/umbraco/management/api/v1/member-type/{id}/move'; +}; + +export type PutMemberTypeByIdMoveErrors = { + /** + * Bad Request + */ + 400: ProblemDetails; + /** + * The resource is protected and requires an authentication token + */ + 401: unknown; + /** + * The authenticated user does not have access to this resource + */ + 403: unknown; + /** + * Not Found + */ + 404: ProblemDetails; +}; + +export type PutMemberTypeByIdMoveError = PutMemberTypeByIdMoveErrors[keyof PutMemberTypeByIdMoveErrors]; + +export type PutMemberTypeByIdMoveResponses = { + /** + * OK + */ + 200: unknown; +}; + export type PostMemberTypeAvailableCompositionsData = { body?: MemberTypeCompositionRequestModel; path?: never; @@ -10952,12 +11075,109 @@ export type PutMemberTypeFolderByIdResponses = { 200: unknown; }; +export type PostMemberTypeImportData = { + body?: ImportMemberTypeRequestModel; + path?: never; + query?: never; + url: '/umbraco/management/api/v1/member-type/import'; +}; + +export type PostMemberTypeImportErrors = { + /** + * Bad Request + */ + 400: ProblemDetails; + /** + * The resource is protected and requires an authentication token + */ + 401: unknown; + /** + * The authenticated user does not have access to this resource + */ + 403: unknown; + /** + * Not Found + */ + 404: ProblemDetails; +}; + +export type PostMemberTypeImportError = PostMemberTypeImportErrors[keyof PostMemberTypeImportErrors]; + +export type PostMemberTypeImportResponses = { + /** + * Created + */ + 201: unknown; +}; + +export type GetTreeMemberTypeAncestorsData = { + body?: never; + path?: never; + query?: { + descendantId?: string; + }; + url: '/umbraco/management/api/v1/tree/member-type/ancestors'; +}; + +export type GetTreeMemberTypeAncestorsErrors = { + /** + * The resource is protected and requires an authentication token + */ + 401: unknown; + /** + * The authenticated user does not have access to this resource + */ + 403: unknown; +}; + +export type GetTreeMemberTypeAncestorsResponses = { + /** + * OK + */ + 200: Array; +}; + +export type GetTreeMemberTypeAncestorsResponse = GetTreeMemberTypeAncestorsResponses[keyof GetTreeMemberTypeAncestorsResponses]; + +export type GetTreeMemberTypeChildrenData = { + body?: never; + path?: never; + query?: { + parentId?: string; + skip?: number; + take?: number; + foldersOnly?: boolean; + }; + url: '/umbraco/management/api/v1/tree/member-type/children'; +}; + +export type GetTreeMemberTypeChildrenErrors = { + /** + * The resource is protected and requires an authentication token + */ + 401: unknown; + /** + * The authenticated user does not have access to this resource + */ + 403: unknown; +}; + +export type GetTreeMemberTypeChildrenResponses = { + /** + * OK + */ + 200: PagedMemberTypeTreeItemResponseModel; +}; + +export type GetTreeMemberTypeChildrenResponse = GetTreeMemberTypeChildrenResponses[keyof GetTreeMemberTypeChildrenResponses]; + export type GetTreeMemberTypeRootData = { body?: never; path?: never; query?: { skip?: number; take?: number; + foldersOnly?: boolean; }; url: '/umbraco/management/api/v1/tree/member-type/root'; }; @@ -10989,6 +11209,7 @@ export type GetTreeMemberTypeSiblingsData = { target?: string; before?: number; after?: number; + foldersOnly?: boolean; }; url: '/umbraco/management/api/v1/tree/member-type/siblings'; }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/create/default/default-media-type-create-option-action.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/create/default/default-media-type-create-option-action.ts index 6ab3649fb25c..ddcb66d1a16d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/create/default/default-media-type-create-option-action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/create/default/default-media-type-create-option-action.ts @@ -6,7 +6,7 @@ import type { MetaEntityCreateOptionAction } from '@umbraco-cms/backoffice/entit export class UmbDefaultMediaTypeCreateOptionAction extends UmbEntityCreateOptionActionBase { override async getHref() { const parentEntityType = this.args.entityType as UmbMediaTypeRootEntityType | UmbMediaTypeFolderEntityType; - if (!parentEntityType) throw new Error('Entity type is required to create a document type'); + if (!parentEntityType) throw new Error('Entity type is required to create a media type'); const parentUnique = this.args.unique ?? null; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/constants.ts index 1c409bd6f9d9..7fb26d46542c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/constants.ts @@ -8,4 +8,8 @@ export * from './search/constants.js'; export * from './tree/constants.js'; export * from './workspace/constants.js'; -export { UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE, UMB_MEMBER_TYPE_ENTITY_TYPE } from './entity.js'; +export { + UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE, + UMB_MEMBER_TYPE_ENTITY_TYPE, + UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE, +} from './entity.js'; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/constants.ts index 823b4dcabd2e..1be716055e3b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/constants.ts @@ -1 +1,4 @@ export * from './duplicate/constants.js'; +export * from './export/constants.js'; +export * from './import/constants.js'; +export * from './move-to/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/create/default/default-member-type-create-option-action.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/create/default/default-member-type-create-option-action.ts index 99620efd54a2..3729a04f64ff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/create/default/default-member-type-create-option-action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/create/default/default-member-type-create-option-action.ts @@ -1,11 +1,11 @@ -import type { UmbMemberTypeRootEntityType } from '../../../entity.js'; +import type { UmbMemberTypeFolderEntityType, UmbMemberTypeRootEntityType } from '../../../entity.js'; import { UMB_CREATE_MEMBER_TYPE_WORKSPACE_PATH_PATTERN } from '../../../paths.js'; import { UmbEntityCreateOptionActionBase } from '@umbraco-cms/backoffice/entity-create-option-action'; import type { MetaEntityCreateOptionAction } from '@umbraco-cms/backoffice/entity-create-option-action'; export class UmbDefaultMemberTypeCreateOptionAction extends UmbEntityCreateOptionActionBase { override async getHref() { - const parentEntityType = this.args.entityType as UmbMemberTypeRootEntityType; + const parentEntityType = this.args.entityType as UmbMemberTypeRootEntityType | UmbMemberTypeFolderEntityType; if (!parentEntityType) throw new Error('Entity type is required to create a member type'); const parentUnique = this.args.unique ?? null; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/create/default/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/create/default/manifests.ts index c10dcb5f4ebe..b451aeed8d0c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/create/default/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/create/default/manifests.ts @@ -1,4 +1,4 @@ -import { UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE } from '../../../entity.js'; +import { UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE, UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE } from '../../../entity.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifests: Array = [ @@ -8,10 +8,12 @@ export const manifests: Array = name: 'Default Member Type Entity Create Option Action', weight: 1000, api: () => import('./default-member-type-create-option-action.js'), - forEntityTypes: [UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE], + forEntityTypes: [UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE, UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE], meta: { icon: 'icon-user', label: '#content_membertype', }, }, ]; + + diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/create/folder/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/create/folder/manifests.ts new file mode 100644 index 000000000000..48f14fa7449d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/create/folder/manifests.ts @@ -0,0 +1,19 @@ +import { UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE, UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE } from '../../../entity.js'; +import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; +import { UMB_MEMBER_TYPE_FOLDER_REPOSITORY_ALIAS } from '../../../tree/folder/constants.js'; + +export const manifests: Array = [ + { + type: 'entityCreateOptionAction', + kind: 'folder', + alias: 'Umb.EntityCreateOptionAction.MemberType.Folder', + name: 'Member Type Folder Entity Create Option Action', + forEntityTypes: [UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE, UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE], + meta: { + icon: 'icon-folder', + label: '#create_folder', + additionalOptions: true, + folderRepositoryAlias: UMB_MEMBER_TYPE_FOLDER_REPOSITORY_ALIAS, + }, + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/create/manifests.ts index a8772bc1b685..94250501b9af 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/create/manifests.ts @@ -1,5 +1,10 @@ -import { UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE } from '../../entity.js'; +import { + UMB_MEMBER_TYPE_ENTITY_TYPE, + UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE, + UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE, +} from '../../entity.js'; import { manifests as defaultManifests } from './default/manifests.js'; +import { manifests as folderManifests } from './folder/manifests.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifests: Array = [ @@ -8,7 +13,9 @@ export const manifests: Array = kind: 'create', alias: 'Umb.EntityAction.MemberType.Create', name: 'Create Member Type Entity Action', - forEntityTypes: [UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE], + weight: 1200, + forEntityTypes: [UMB_MEMBER_TYPE_ENTITY_TYPE, UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE, UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE], }, ...defaultManifests, + ...folderManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/duplicate/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/duplicate/manifests.ts index 6c8fe5f4c80b..7607b8aaa14b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/duplicate/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/duplicate/manifests.ts @@ -1,18 +1,23 @@ -import { UMB_MEMBER_TYPE_ENTITY_TYPE } from '../../entity.js'; -import { UMB_MEMBER_TYPE_TREE_REPOSITORY_ALIAS } from '../../constants.js'; -import { UMB_DUPLICATE_MEMBER_TYPE_REPOSITORY_ALIAS } from './repository/index.js'; +import { + UMB_MEMBER_TYPE_ENTITY_TYPE, + UMB_MEMBER_TYPE_TREE_ALIAS, + UMB_MEMBER_TYPE_TREE_REPOSITORY_ALIAS, +} from '../../constants.js'; +import { UMB_DUPLICATE_MEMBER_TYPE_REPOSITORY_ALIAS } from './constants.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; export const manifests: Array = [ { type: 'entityAction', - kind: 'duplicate', - alias: 'Umb.EntityAction.MemberType.Duplicate', - name: 'Duplicate Member Type Entity Action', + kind: 'duplicateTo', + alias: 'Umb.EntityAction.MemberType.DuplicateTo', + name: 'Duplicate Document To Entity Action', forEntityTypes: [UMB_MEMBER_TYPE_ENTITY_TYPE], meta: { duplicateRepositoryAlias: UMB_DUPLICATE_MEMBER_TYPE_REPOSITORY_ALIAS, + treeAlias: UMB_MEMBER_TYPE_TREE_ALIAS, treeRepositoryAlias: UMB_MEMBER_TYPE_TREE_REPOSITORY_ALIAS, + foldersOnly: true, }, }, ...repositoryManifests, diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/duplicate/repository/member-type-duplicate.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/duplicate/repository/member-type-duplicate.repository.ts index 441d2704dc65..3ac378a39201 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/duplicate/repository/member-type-duplicate.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/duplicate/repository/member-type-duplicate.repository.ts @@ -1,13 +1,13 @@ import { UmbDuplicateMemberTypeServerDataSource } from './member-type-duplicate.server.data-source.js'; import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; -import type { UmbDuplicateRepository, UmbDuplicateRequestArgs } from '@umbraco-cms/backoffice/entity-action'; +import type { UmbDuplicateToRepository, UmbDuplicateToRequestArgs } from '@umbraco-cms/backoffice/tree'; import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; -export class UmbDuplicateMemberTypeRepository extends UmbRepositoryBase implements UmbDuplicateRepository { +export class UmbDuplicateMemberTypeRepository extends UmbRepositoryBase implements UmbDuplicateToRepository { #duplicateSource = new UmbDuplicateMemberTypeServerDataSource(this); - async requestDuplicate(args: UmbDuplicateRequestArgs) { - const { error } = await this.#duplicateSource.duplicate(args); + async requestDuplicateTo(args: UmbDuplicateToRequestArgs) { + const { error } = await this.#duplicateSource.duplicateTo(args); if (!error) { const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/duplicate/repository/member-type-duplicate.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/duplicate/repository/member-type-duplicate.server.data-source.ts index 99c6b949a09a..ed5ed5d81955 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/duplicate/repository/member-type-duplicate.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/duplicate/repository/member-type-duplicate.server.data-source.ts @@ -1,13 +1,13 @@ import { MemberTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecute } from '@umbraco-cms/backoffice/resources'; -import type { UmbDuplicateDataSource, UmbDuplicateRequestArgs } from '@umbraco-cms/backoffice/entity-action'; +import type { UmbDuplicateToDataSource, UmbDuplicateToRequestArgs } from '@umbraco-cms/backoffice/tree'; /** - * Duplicate Document Server Data Source + * Duplicate Member Type Server Data Source * @class UmbDuplicateMemberTypeServerDataSource */ -export class UmbDuplicateMemberTypeServerDataSource implements UmbDuplicateDataSource { +export class UmbDuplicateMemberTypeServerDataSource implements UmbDuplicateToDataSource { #host: UmbControllerHost; /** @@ -20,18 +20,22 @@ export class UmbDuplicateMemberTypeServerDataSource implements UmbDuplicateDataS } /** - * Duplicate an item for the given unique - * @param {UmbDuplicateRequestArgs} args + * Duplicate an item for the given unique to the destination unique + * @param {UmbDuplicateToRequestArgs} args * @returns {*} - * @memberof UmbDuplicateDataTypeServerDataSource + * @memberof UmbDuplicateMemberTypeServerDataSource */ - async duplicate(args: UmbDuplicateRequestArgs) { + async duplicateTo(args: UmbDuplicateToRequestArgs) { if (!args.unique) throw new Error('Unique is missing'); + if (args.destination.unique === undefined) throw new Error('Destination unique is missing'); return tryExecute( this.#host, MemberTypeService.postMemberTypeByIdCopy({ path: { id: args.unique }, + body: { + target: args.destination.unique ? { id: args.destination.unique } : null, + }, }), ); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/constants.ts new file mode 100644 index 000000000000..41a409dec1f0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/constants.ts @@ -0,0 +1 @@ +export * from './repository/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/manifests.ts new file mode 100644 index 000000000000..9c04f8d83202 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/manifests.ts @@ -0,0 +1,19 @@ +import { UMB_MEMBER_TYPE_ENTITY_TYPE } from '../../entity.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; + +export const manifests: Array = [ + { + type: 'entityAction', + kind: 'default', + alias: 'Umb.EntityAction.MemberType.Export', + name: 'Export Member Type Entity Action', + forEntityTypes: [UMB_MEMBER_TYPE_ENTITY_TYPE], + api: () => import('./member-type-export.action.js'), + meta: { + icon: 'icon-download-alt', + label: '#actions_export', + additionalOptions: true, + }, + }, + ...repositoryManifests, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/member-type-export.action.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/member-type-export.action.ts new file mode 100644 index 000000000000..e96730dc9398 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/member-type-export.action.ts @@ -0,0 +1,21 @@ +import { UmbExportMemberTypeRepository } from './repository/index.js'; +import { blobDownload } from '@umbraco-cms/backoffice/utils'; +import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; + +export class UmbExportMemberTypeEntityAction extends UmbEntityActionBase { + #repository = new UmbExportMemberTypeRepository(this); + + override async execute() { + if (!this.args.unique) throw new Error('Unique is not available'); + + const { data, error } = await this.#repository.requestExport(this.args.unique); + + if (error) { + throw error; + } + + blobDownload(data, `${this.args.unique}.udt`, 'text/xml'); + } +} + +export default UmbExportMemberTypeEntityAction; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/repository/constants.ts new file mode 100644 index 000000000000..518d058c3a62 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/repository/constants.ts @@ -0,0 +1 @@ +export const UMB_EXPORT_MEMBER_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.MemberType.Export'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/repository/index.ts new file mode 100644 index 000000000000..5727b26a2303 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/repository/index.ts @@ -0,0 +1,2 @@ +export { UmbExportMemberTypeRepository } from './member-type-export.repository.js'; +export { UMB_EXPORT_MEMBER_TYPE_REPOSITORY_ALIAS } from './constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/repository/manifests.ts new file mode 100644 index 000000000000..cdf39e84cafd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/repository/manifests.ts @@ -0,0 +1,10 @@ +import { UMB_EXPORT_MEMBER_TYPE_REPOSITORY_ALIAS } from './constants.js'; + +export const manifests: Array = [ + { + type: 'repository', + alias: UMB_EXPORT_MEMBER_TYPE_REPOSITORY_ALIAS, + name: 'Export Member Type Repository', + api: () => import('./member-type-export.repository.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/repository/member-type-export.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/repository/member-type-export.repository.ts new file mode 100644 index 000000000000..043771dfade2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/repository/member-type-export.repository.ts @@ -0,0 +1,24 @@ +import { UmbExportMemberTypeServerDataSource } from './member-type-export.server.data-source.js'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export class UmbExportMemberTypeRepository extends UmbRepositoryBase { + #exportSource = new UmbExportMemberTypeServerDataSource(this); + + async requestExport(unique: string) { + const { data, error } = await this.#exportSource.export(unique); + + if (!error) { + const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); + if (!notificationContext) { + throw new Error('Notification context not found'); + } + const notification = { data: { message: `Exported` } }; + notificationContext.peek('positive', notification); + } + + return { data, error }; + } +} + +export { UmbExportMemberTypeRepository as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/repository/member-type-export.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/repository/member-type-export.server.data-source.ts new file mode 100644 index 000000000000..a2673ead9889 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/export/repository/member-type-export.server.data-source.ts @@ -0,0 +1,33 @@ +import { MemberTypeService } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecute } from '@umbraco-cms/backoffice/resources'; + +/** + * Export Member Server Data Source + * @export + * @class UmbExportMemberTypeServerDataSource + */ +export class UmbExportMemberTypeServerDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbExportMemberTypeServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbExportMemberTypeServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Export an item for the given id to the destination unique + * @param {unique} unique + * @returns {*} + * @memberof UmbExportMemberTypeServerDataSource + */ + async export(unique: string) { + if (!unique) throw new Error('Unique is missing'); + + return tryExecute(this.#host, MemberTypeService.getMemberTypeByIdExport({ path: { id: unique } })); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/constants.ts new file mode 100644 index 000000000000..9c35ab3ee734 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/constants.ts @@ -0,0 +1,2 @@ +export * from './modal/constants.js'; +export * from './repository/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/manifests.ts new file mode 100644 index 000000000000..a8a2f384ef42 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/manifests.ts @@ -0,0 +1,21 @@ +import { UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE } from '../../entity.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; +import { manifests as modalManifests } from './modal/manifests.js'; + +export const manifests: Array = [ + { + type: 'entityAction', + kind: 'default', + alias: 'Umb.EntityAction.MemberType.Import', + name: 'Export Member Type Entity Action', + forEntityTypes: [UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE], + api: () => import('./member-type-import.action.js'), + meta: { + icon: 'icon-page-up', + label: '#actions_import', + additionalOptions: true, + }, + }, + ...repositoryManifests, + ...modalManifests, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/member-type-import.action.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/member-type-import.action.ts new file mode 100644 index 000000000000..034176f038e0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/member-type-import.action.ts @@ -0,0 +1,25 @@ +import { UMB_MEMBER_TYPE_IMPORT_MODAL } from './modal/member-type-import-modal.token.js'; +import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; +import { UmbEntityActionBase, UmbRequestReloadChildrenOfEntityEvent } from '@umbraco-cms/backoffice/entity-action'; +import { umbOpenModal } from '@umbraco-cms/backoffice/modal'; + +export class UmbImportMemberTypeEntityAction extends UmbEntityActionBase { + override async execute() { + await umbOpenModal(this, UMB_MEMBER_TYPE_IMPORT_MODAL, { + data: { unique: this.args.unique }, + }).catch(() => {}); + + const actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + if (!actionEventContext) { + throw new Error('Action event context not found.'); + } + const event = new UmbRequestReloadChildrenOfEntityEvent({ + unique: this.args.unique, + entityType: this.args.entityType, + }); + + actionEventContext.dispatchEvent(event); + } +} + +export default UmbImportMemberTypeEntityAction; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/modal/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/modal/constants.ts new file mode 100644 index 000000000000..07be8e56dd35 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/modal/constants.ts @@ -0,0 +1 @@ +export * from './member-type-import-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/modal/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/modal/manifests.ts new file mode 100644 index 000000000000..92d0f6fc2d4b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/modal/manifests.ts @@ -0,0 +1,10 @@ +import type { ManifestModal } from '@umbraco-cms/backoffice/modal'; + +export const manifests: Array = [ + { + type: 'modal', + alias: 'Umb.Modal.MemberType.Import', + name: 'Member Type Import Modal', + element: () => import('./member-type-import-modal.element.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/modal/member-type-import-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/modal/member-type-import-modal.element.ts new file mode 100644 index 000000000000..e9f7e6582ddf --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/modal/member-type-import-modal.element.ts @@ -0,0 +1,171 @@ +import { UmbMemberTypeImportRepository } from '../repository/member-type-import.repository.js'; +import type { UmbMemberTypeImportModalData, UmbMemberTypeImportModalValue } from './member-type-import-modal.token.js'; +import { css, html, customElement, state, when } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; +import type { UmbDropzoneMediaElement } from '@umbraco-cms/backoffice/media'; +import type { UmbDropzoneChangeEvent } from '@umbraco-cms/backoffice/dropzone'; + +interface UmbMemberTypePreview { + unique: string; + name: string; + alias: string; + icon: string; +} + +@customElement('umb-member-type-import-modal') +export class UmbMemberTypeImportModalLayout extends UmbModalBaseElement< + UmbMemberTypeImportModalData, + UmbMemberTypeImportModalValue +> { + #memberTypeImportRepository = new UmbMemberTypeImportRepository(this); + #temporaryUnique?: string; + #fileReader; + + @state() + private _fileContent: Array = []; + + constructor() { + super(); + this.#fileReader = new FileReader(); + this.#fileReader.onload = (e) => { + if (typeof e.target?.result === 'string') { + const fileContent = e.target.result; + this.#memberTypePreviewBuilder(fileContent); + } else { + this.#requestReset(); + } + }; + } + + #onUploadComplete(evt: UmbDropzoneChangeEvent) { + evt.preventDefault(); + const target = evt.target as UmbDropzoneMediaElement; + const data = target.value; + if (!data?.length) return; + + const file = data[0]; + + if (file.temporaryFile) { + this.#temporaryUnique = file.temporaryFile.temporaryUnique; + this.#fileReader.readAsText(file.temporaryFile.file); + } + } + + async #onFileImport() { + if (!this.#temporaryUnique) return; + const { error } = await this.#memberTypeImportRepository.requestImport(this.#temporaryUnique); + if (error) return; + this._submitModal(); + } + + #memberTypePreviewBuilder(htmlString: string) { + const parser = new DOMParser(); + const doc = parser.parseFromString(htmlString, 'text/xml'); + const childNodes = doc.childNodes; + + const elements: Array = []; + + childNodes.forEach((node) => { + if (node.nodeType === Node.ELEMENT_NODE && node.nodeName === 'MemberType') { + elements.push(node as Element); + } + }); + + this._fileContent = this.#memberTypePreviewItemBuilder(elements); + } + + #memberTypePreviewItemBuilder(elements: Array) { + const memberTypes: Array = []; + elements.forEach((MemberType) => { + const info = MemberType.getElementsByTagName('Info')[0]; + const unique = info.getElementsByTagName('Key')[0].textContent ?? ''; + const name = info.getElementsByTagName('Name')[0].textContent ?? ''; + const alias = info.getElementsByTagName('Alias')[0].textContent ?? ''; + const icon = info.getElementsByTagName('Icon')[0].textContent ?? ''; + + memberTypes.push({ unique, name, alias, icon }); + }); + return memberTypes; + } + + #requestReset() { + this._fileContent = []; + this.#temporaryUnique = undefined; + } + + override render() { + return html` + ${this.#renderUploadZone()} + + + `; + } + + #renderUploadZone() { + return html` + ${when( + this._fileContent.length, + () => + html` + + + `, + () => + html`
+ Drag and drop your file(s) into the area + +
`, + )} + `; + } + + static override styles = [ + UmbTextStyles, + css` + #wrapper { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + position: relative; + gap: var(--uui-size-space-3); + border: 2px dashed var(--uui-color-divider-standalone); + background-color: var(--uui-color-surface-alt); + padding: var(--uui-size-space-6); + } + + #dropzone { + width: 100%; + } + + #import { + margin-top: var(--uui-size-space-6); + } + `, + ]; +} + +export default UmbMemberTypeImportModalLayout; + +declare global { + interface HTMLElementTagNameMap { + 'umb-member-type-import-modal': UmbMemberTypeImportModalLayout; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/modal/member-type-import-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/modal/member-type-import-modal.token.ts new file mode 100644 index 000000000000..846258a5efc8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/modal/member-type-import-modal.token.ts @@ -0,0 +1,18 @@ +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbMemberTypeImportModalData { + unique: string | null; +} + +// eslint-disable-next-line @typescript-eslint/no-empty-object-type +export interface UmbMemberTypeImportModalValue {} + +export const UMB_MEMBER_TYPE_IMPORT_MODAL = new UmbModalToken( + 'Umb.Modal.MemberType.Import', + { + modal: { + type: 'sidebar', + size: 'small', + }, + }, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/repository/constants.ts new file mode 100644 index 000000000000..9f0bc8267dc2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/repository/constants.ts @@ -0,0 +1 @@ +export const UMB_MEMBER_TYPE_IMPORT_REPOSITORY_ALIAS = 'Umb.Repository.MemberType.Import'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/repository/index.ts new file mode 100644 index 000000000000..aeb3177637f1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/repository/index.ts @@ -0,0 +1,2 @@ +export { UmbMemberTypeImportRepository } from './member-type-import.repository.js'; +export { UMB_MEMBER_TYPE_IMPORT_REPOSITORY_ALIAS } from './constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/repository/manifests.ts new file mode 100644 index 000000000000..0d6403abd00f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/repository/manifests.ts @@ -0,0 +1,10 @@ +import { UMB_MEMBER_TYPE_IMPORT_REPOSITORY_ALIAS } from './constants.js'; + +export const manifests: Array = [ + { + type: 'repository', + alias: UMB_MEMBER_TYPE_IMPORT_REPOSITORY_ALIAS, + name: 'Import Member Type Repository', + api: () => import('./member-type-import.repository.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/repository/member-type-import.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/repository/member-type-import.repository.ts new file mode 100644 index 000000000000..57f3ffa0b201 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/repository/member-type-import.repository.ts @@ -0,0 +1,24 @@ +import { UmbMemberTypeImportServerDataSource } from './member-type-import.server.data-source.js'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export class UmbMemberTypeImportRepository extends UmbRepositoryBase { + #importSource = new UmbMemberTypeImportServerDataSource(this); + + async requestImport(temporaryUnique: string) { + const { data, error } = await this.#importSource.import(temporaryUnique); + + if (!error) { + const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); + if (!notificationContext) { + throw new Error('Notification context not found'); + } + const notification = { data: { message: `Imported` } }; + notificationContext.peek('positive', notification); + } + + return { data, error }; + } +} + +export { UmbMemberTypeImportRepository as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/repository/member-type-import.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/repository/member-type-import.server.data-source.ts new file mode 100644 index 000000000000..1a33e24e0a0d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/import/repository/member-type-import.server.data-source.ts @@ -0,0 +1,37 @@ +import { MemberTypeService, type ImportMemberTypeRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecute } from '@umbraco-cms/backoffice/resources'; + +/** + * Member Type Import Server Data Source + * @Import + * @class UmbMemberTypeImportServerDataSource + */ +export class UmbMemberTypeImportServerDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbMemberTypeImportServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbMemberTypeImportServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Import an item for the given id to the destination unique + * @param {temporaryUnique} temporaryUnique + * @returns {*} + * @memberof UmbMemberTypeImportServerDataSource + */ + async import(temporaryUnique: string) { + if (!temporaryUnique) throw new Error('Unique is missing'); + + const body: ImportMemberTypeRequestModel = { + file: { id: temporaryUnique }, + }; + + return tryExecute(this.#host, MemberTypeService.postMemberTypeImport({ body })); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/manifests.ts index 5710fdf91446..4dfba0507c98 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/manifests.ts @@ -1,7 +1,13 @@ -import { UMB_MEMBER_TYPE_DETAIL_REPOSITORY_ALIAS, UMB_MEMBER_TYPE_ITEM_REPOSITORY_ALIAS } from '../constants.js'; -import { UMB_MEMBER_TYPE_ENTITY_TYPE } from '../entity.js'; +import { + UMB_MEMBER_TYPE_ENTITY_TYPE, + UMB_MEMBER_TYPE_DETAIL_REPOSITORY_ALIAS, + UMB_MEMBER_TYPE_ITEM_REPOSITORY_ALIAS, +} from '../constants.js'; import { manifests as createManifests } from './create/manifests.js'; +import { manifests as moveManifests } from './move-to/manifests.js'; import { manifests as duplicateManifests } from './duplicate/manifests.js'; +import { manifests as exportManifests } from './export/manifests.js'; +import { manifests as importManifests } from './import/manifests.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifests: Array = [ @@ -17,5 +23,8 @@ export const manifests: Array = }, }, ...createManifests, + ...moveManifests, ...duplicateManifests, + ...exportManifests, + ...importManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/constants.ts new file mode 100644 index 000000000000..41a409dec1f0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/constants.ts @@ -0,0 +1 @@ +export * from './repository/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/index.ts new file mode 100644 index 000000000000..fb3905b43579 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/index.ts @@ -0,0 +1 @@ +export { UmbMoveMemberTypeRepository } from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/manifests.ts new file mode 100644 index 000000000000..1567d9c2c51e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/manifests.ts @@ -0,0 +1,21 @@ +import { UMB_MEMBER_TYPE_ENTITY_TYPE } from '../../entity.js'; +import { UMB_MEMBER_TYPE_TREE_REPOSITORY_ALIAS, UMB_MEMBER_TYPE_TREE_ALIAS } from '../../constants.js'; +import { UMB_MOVE_MEMBER_TYPE_REPOSITORY_ALIAS } from './constants.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; + +export const manifests: Array = [ + { + type: 'entityAction', + kind: 'moveTo', + alias: 'Umb.EntityAction.MemberType.MoveTo', + name: 'Move Member Type Entity Action', + forEntityTypes: [UMB_MEMBER_TYPE_ENTITY_TYPE], + meta: { + treeRepositoryAlias: UMB_MEMBER_TYPE_TREE_REPOSITORY_ALIAS, + moveRepositoryAlias: UMB_MOVE_MEMBER_TYPE_REPOSITORY_ALIAS, + treeAlias: UMB_MEMBER_TYPE_TREE_ALIAS, + foldersOnly: true, + }, + }, + ...repositoryManifests, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/repository/constants.ts new file mode 100644 index 000000000000..6861584d77e0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/repository/constants.ts @@ -0,0 +1 @@ +export const UMB_MOVE_MEMBER_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.MemberType.Move'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/repository/index.ts new file mode 100644 index 000000000000..83313ec3cda8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/repository/index.ts @@ -0,0 +1 @@ +export { UmbMoveMemberTypeRepository } from './member-type-move.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/repository/manifests.ts new file mode 100644 index 000000000000..6adc9ee5efef --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/repository/manifests.ts @@ -0,0 +1,10 @@ +import { UMB_MOVE_MEMBER_TYPE_REPOSITORY_ALIAS } from './constants.js'; + +export const manifests: Array = [ + { + type: 'repository', + alias: UMB_MOVE_MEMBER_TYPE_REPOSITORY_ALIAS, + name: 'Move Member Type Repository', + api: () => import('./member-type-move.repository.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/repository/member-type-move.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/repository/member-type-move.repository.ts new file mode 100644 index 000000000000..e57ddbc3b4fa --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/repository/member-type-move.repository.ts @@ -0,0 +1,25 @@ +import { UmbMoveMemberTypeServerDataSource } from './member-type-move.server.data-source.js'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import type { UmbMoveRepository, UmbMoveToRequestArgs } from '@umbraco-cms/backoffice/tree'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export class UmbMoveMemberTypeRepository extends UmbRepositoryBase implements UmbMoveRepository { + #moveSource = new UmbMoveMemberTypeServerDataSource(this); + + async requestMoveTo(args: UmbMoveToRequestArgs) { + const { error } = await this.#moveSource.moveTo(args); + + if (!error) { + const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); + if (!notificationContext) { + throw new Error(`Failed to load notification context`); + } + const notification = { data: { message: `Moved` } }; + notificationContext.peek('positive', notification); + } + + return { error }; + } +} + +export { UmbMoveMemberTypeRepository as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/repository/member-type-move.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/repository/member-type-move.server.data-source.ts new file mode 100644 index 000000000000..7719bf4d4dd8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/move-to/repository/member-type-move.server.data-source.ts @@ -0,0 +1,44 @@ +import { MemberTypeService } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecute } from '@umbraco-cms/backoffice/resources'; +import type { UmbMoveDataSource, UmbMoveToRequestArgs } from '@umbraco-cms/backoffice/tree'; + +/** + * Move Member Type Server Data Source + * @class UmbMoveMemberTypeServerDataSource + */ +export class UmbMoveMemberTypeServerDataSource implements UmbMoveDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbMoveMemberTypeServerDataSource. + * @param {UmbControllerHost} host - The controller host for this controller to be appended to + * @memberof UmbMoveMemberTypeServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Move an item for the given id to the target unique + * @param {string} unique + * @param {(string | null)} targetUnique + * @param args + * @returns {*} + * @memberof UmbMoveMemberTypeServerDataSource + */ + async moveTo(args: UmbMoveToRequestArgs) { + if (!args.unique) throw new Error('Unique is missing'); + if (args.destination.unique === undefined) throw new Error('Destination unique is missing'); + + return tryExecute( + this.#host, + MemberTypeService.putMemberTypeByIdMove({ + path: { id: args.unique }, + body: { + target: args.destination.unique ? { id: args.destination.unique } : null, + }, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity.ts index d0ad010ae119..00c602e4a366 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity.ts @@ -1,5 +1,7 @@ export const UMB_MEMBER_TYPE_ENTITY_TYPE = 'member-type'; export const UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE = 'member-type-root'; +export const UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE = 'member-type-folder'; export type UmbMemberTypeEntityType = typeof UMB_MEMBER_TYPE_ENTITY_TYPE; export type UmbMemberTypeRootEntityType = typeof UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE; +export type UmbMemberTypeFolderEntityType = typeof UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/repository/detail/member-type-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/repository/detail/member-type-detail.server.data-source.ts index 3d3baaff7cb1..66f3f2a937a2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/repository/detail/member-type-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/repository/detail/member-type-detail.server.data-source.ts @@ -130,7 +130,7 @@ export class UmbMemberTypeDetailServerDataSource implements UmbDetailDataSource< * @returns {*} * @memberof UmbMemberTypeDetailServerDataSource */ - async create(model: UmbMemberTypeDetailModel) { + async create(model: UmbMemberTypeDetailModel, parentUnique: string | null = null) { if (!model) throw new Error('Member Type is missing'); // TODO: make data mapper to prevent errors @@ -162,6 +162,7 @@ export class UmbMemberTypeDetailServerDataSource implements UmbDetailDataSource< }), containers: model.containers, id: model.unique, + parent: parentUnique ? { id: parentUnique } : null, compositions: model.compositions.map((composition) => { return { memberType: { id: composition.contentType.unique }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/repository/item/types.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/repository/item/types.ts index e79c93407031..3dfb51b4580c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/repository/item/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/repository/item/types.ts @@ -1,7 +1,7 @@ -import type { UmbMemberTypeEntityType } from '../../entity.js'; +import type { UmbMemberTypeEntityType, UmbMemberTypeFolderEntityType } from '../../entity.js'; export interface UmbMemberTypeItemModel { - entityType: UmbMemberTypeEntityType; + entityType: UmbMemberTypeEntityType | UmbMemberTypeFolderEntityType; unique: string; name: string; icon: string; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/constants.ts index 89b5f2b7ea26..08d229a21f8a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/constants.ts @@ -7,4 +7,5 @@ export const UMB_MEMBER_TYPE_TREE_ALIAS = 'Umb.Tree.MemberType'; export { UMB_MEMBER_TYPE_TREE_STORE_CONTEXT } from './member-type-tree.store.context-token.js'; +export * from './folder/constants.js'; export * from './tree-item-children/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/constants.ts new file mode 100644 index 000000000000..7072c998ae6a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/constants.ts @@ -0,0 +1,2 @@ +export * from './repository/constants.js'; +export * from './workspace/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/manifests.ts new file mode 100644 index 000000000000..4b58de8a2791 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/manifests.ts @@ -0,0 +1,29 @@ +import { UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE } from '../../entity.js'; +import { UMB_MEMBER_TYPE_FOLDER_REPOSITORY_ALIAS } from './repository/constants.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; +import { manifests as workspaceManifests } from './workspace/manifests.js'; + +export const manifests: Array = [ + { + type: 'entityAction', + kind: 'folderUpdate', + alias: 'Umb.EntityAction.MemberType.Folder.Update', + name: 'Rename Member Type Folder Entity Action', + forEntityTypes: [UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE], + meta: { + folderRepositoryAlias: UMB_MEMBER_TYPE_FOLDER_REPOSITORY_ALIAS, + }, + }, + { + type: 'entityAction', + kind: 'folderDelete', + alias: 'Umb.EntityAction.MemberType.Folder.Delete', + name: 'Delete Member Type Folder Entity Action', + forEntityTypes: [UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE], + meta: { + folderRepositoryAlias: UMB_MEMBER_TYPE_FOLDER_REPOSITORY_ALIAS, + }, + }, + ...repositoryManifests, + ...workspaceManifests, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/constants.ts new file mode 100644 index 000000000000..44b3a93f8aed --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/constants.ts @@ -0,0 +1,4 @@ +export const UMB_MEMBER_TYPE_FOLDER_REPOSITORY_ALIAS = 'Umb.Repository.MemberType.Folder'; +export const UMB_MEMBER_TYPE_FOLDER_STORE_ALIAS = 'Umb.Store.MemberType.Folder'; +export * from './member-type-folder.repository.js'; +export { UMB_MEMBER_TYPE_FOLDER_STORE_CONTEXT } from './member-type-folder.store.context-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/index.ts new file mode 100644 index 000000000000..f7df84e6015c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/index.ts @@ -0,0 +1 @@ +export * from './member-type-folder.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/manifests.ts new file mode 100644 index 000000000000..0c010b70e63a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/manifests.ts @@ -0,0 +1,16 @@ +import { UMB_MEMBER_TYPE_FOLDER_REPOSITORY_ALIAS, UMB_MEMBER_TYPE_FOLDER_STORE_ALIAS } from './constants.js'; + +export const manifests: Array = [ + { + type: 'repository', + alias: UMB_MEMBER_TYPE_FOLDER_REPOSITORY_ALIAS, + name: 'Member Type Folder Repository', + api: () => import('./member-type-folder.repository.js'), + }, + { + type: 'store', + alias: UMB_MEMBER_TYPE_FOLDER_STORE_ALIAS, + name: 'Member Type Folder Store', + api: () => import('./member-type-folder.store.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/member-type-folder.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/member-type-folder.repository.ts new file mode 100644 index 000000000000..2a8e5166fb92 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/member-type-folder.repository.ts @@ -0,0 +1,13 @@ +import { UmbMemberTypeFolderServerDataSource } from './member-type-folder.server.data-source.js'; +import { UMB_MEMBER_TYPE_FOLDER_STORE_CONTEXT } from './member-type-folder.store.context-token.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbDetailRepositoryBase } from '@umbraco-cms/backoffice/repository'; +import type { UmbFolderModel } from '@umbraco-cms/backoffice/tree'; + +export class UmbMemberTypeFolderRepository extends UmbDetailRepositoryBase { + constructor(host: UmbControllerHost) { + super(host, UmbMemberTypeFolderServerDataSource, UMB_MEMBER_TYPE_FOLDER_STORE_CONTEXT); + } +} + +export default UmbMemberTypeFolderRepository; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/member-type-folder.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/member-type-folder.server.data-source.ts new file mode 100644 index 000000000000..087425869620 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/member-type-folder.server.data-source.ts @@ -0,0 +1,144 @@ +import { UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE } from '../../../entity.js'; +import type { UmbFolderModel } from '@umbraco-cms/backoffice/tree'; +import { MemberTypeService } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecute } from '@umbraco-cms/backoffice/resources'; +import { UmbId } from '@umbraco-cms/backoffice/id'; +import type { UmbDetailDataSource } from '@umbraco-cms/backoffice/repository'; + +/** + * A data source for a Member Type folder that fetches data from the server + * @class UmbMemberTypeFolderServerDataSource + * @implements {RepositoryDetailDataSource} + */ +export class UmbMemberTypeFolderServerDataSource implements UmbDetailDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbMemberTypeFolderServerDataSource. + * @param {UmbControllerHost} host - The controller host for this controller to be appended to + * @memberof UmbMemberTypeFolderServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Creates a scaffold for a Member Type folder + * @param {Partial} [preset] + * @returns {*} + * @memberof UmbMemberTypeFolderServerDataSource + */ + async createScaffold(preset?: Partial) { + const scaffold: UmbFolderModel = { + entityType: UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE, + unique: UmbId.new(), + name: '', + ...preset, + }; + + return { data: scaffold }; + } + + /** + * Fetches a Member Type folder from the server + * @param {string} unique + * @returns {*} + * @memberof UmbMemberTypeFolderServerDataSource + */ + async read(unique: string) { + if (!unique) throw new Error('Unique is missing'); + + const { data, error } = await tryExecute( + this.#host, + MemberTypeService.getMemberTypeFolderById({ + path: { id: unique }, + }), + ); + + if (data) { + const mappedData = { + entityType: UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE, + unique: data.id, + name: data.name, + }; + + return { data: mappedData }; + } + + return { error }; + } + + /** + * Creates a Member Type folder on the server + * @param {UmbFolderModel} model + * @returns {*} + * @memberof UmbMemberTypeFolderServerDataSource + */ + async create(model: UmbFolderModel, parentUnique: string | null) { + if (!model) throw new Error('Data is missing'); + if (!model.unique) throw new Error('Unique is missing'); + if (!model.name) throw new Error('Name is missing'); + + const body = { + id: model.unique, + parent: parentUnique ? { id: parentUnique } : null, + name: model.name, + }; + + const { error } = await tryExecute( + this.#host, + MemberTypeService.postMemberTypeFolder({ + body, + }), + ); + + if (!error) { + return this.read(model.unique); + } + + return { error }; + } + + /** + * Updates a Member Type folder on the server + * @param {UmbUpdateFolderModel} model + * @returns {*} + * @memberof UmbMemberTypeFolderServerDataSource + */ + async update(model: UmbFolderModel) { + if (!model) throw new Error('Data is missing'); + if (!model.unique) throw new Error('Unique is missing'); + if (!model.name) throw new Error('Folder name is missing'); + + const { error } = await tryExecute( + this.#host, + MemberTypeService.putMemberTypeFolderById({ + path: { id: model.unique }, + body: { name: model.name }, + }), + ); + + if (!error) { + return this.read(model.unique); + } + + return { error }; + } + + /** + * Deletes a Member Type folder on the server + * @param {string} unique + * @returns {*} + * @memberof UmbMemberTypeServerDataSource + */ + async delete(unique: string) { + if (!unique) throw new Error('Unique is missing'); + return tryExecute( + this.#host, + MemberTypeService.deleteMemberTypeFolderById({ + path: { id: unique }, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/member-type-folder.store.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/member-type-folder.store.context-token.ts new file mode 100644 index 000000000000..c5517c4a8ca7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/member-type-folder.store.context-token.ts @@ -0,0 +1,6 @@ +import type { UmbMemberTypeFolderStore } from './member-type-folder.store.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_MEMBER_TYPE_FOLDER_STORE_CONTEXT = new UmbContextToken( + 'UmbMemberTypeFolderStore', +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/member-type-folder.store.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/member-type-folder.store.ts new file mode 100644 index 000000000000..199e5ac6c141 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/repository/member-type-folder.store.ts @@ -0,0 +1,22 @@ +import { UMB_MEMBER_TYPE_FOLDER_STORE_CONTEXT } from './member-type-folder.store.context-token.js'; +import { UmbDetailStoreBase } from '@umbraco-cms/backoffice/store'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbFolderModel } from '@umbraco-cms/backoffice/tree'; + +/** + * @class UmbMemberTypeStore + * @augments {UmbStoreBase} + * @description - Data Store for Member Types + */ +export class UmbMemberTypeFolderStore extends UmbDetailStoreBase { + /** + * Creates an instance of UmbMemberTypeStore. + * @param {UmbControllerHost} host - The controller host for this controller to be appended to + * @memberof UmbMemberTypeStore + */ + constructor(host: UmbControllerHost) { + super(host, UMB_MEMBER_TYPE_FOLDER_STORE_CONTEXT.toString()); + } +} + +export { UmbMemberTypeFolderStore as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/types.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/types.ts new file mode 100644 index 000000000000..a5104dc02783 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/types.ts @@ -0,0 +1,6 @@ +import type { UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE } from '../../entity.js'; +import type { UmbMemberTypeTreeItemModel } from '../types.js'; + +export interface UmbMemberTypeFolderTreeItemModel extends UmbMemberTypeTreeItemModel { + entityType: typeof UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/constants.ts new file mode 100644 index 000000000000..837c1b4eba52 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/constants.ts @@ -0,0 +1,3 @@ +export const UMB_MEMBER_TYPE_FOLDER_WORKSPACE_ALIAS = 'Umb.Workspace.MemberType.Folder'; +export * from './member-type-folder.workspace.context-token.js'; +export * from './paths.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/manifests.ts new file mode 100644 index 000000000000..223045da2bd4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/manifests.ts @@ -0,0 +1,34 @@ +import { UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE } from '../../../entity.js'; +import { UMB_MEMBER_TYPE_FOLDER_WORKSPACE_ALIAS } from './constants.js'; +import { UMB_WORKSPACE_CONDITION_ALIAS, UmbSubmitWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; + +export const manifests: Array = [ + { + type: 'workspace', + kind: 'routable', + alias: UMB_MEMBER_TYPE_FOLDER_WORKSPACE_ALIAS, + name: 'Member Type Folder Workspace', + api: () => import('./member-type-folder-workspace.context.js'), + meta: { + entityType: UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE, + }, + }, + { + type: 'workspaceAction', + kind: 'default', + alias: 'Umb.WorkspaceAction.MemberType.Folder.Submit', + name: 'Submit Member Type Folder Workspace Action', + api: UmbSubmitWorkspaceAction, + meta: { + label: '#buttons_save', + look: 'primary', + color: 'positive', + }, + conditions: [ + { + alias: UMB_WORKSPACE_CONDITION_ALIAS, + match: UMB_MEMBER_TYPE_FOLDER_WORKSPACE_ALIAS, + }, + ], + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/member-type-folder-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/member-type-folder-editor.element.ts new file mode 100644 index 000000000000..02666bb80c90 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/member-type-folder-editor.element.ts @@ -0,0 +1,17 @@ +import { html, customElement } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; + +@customElement('umb-member-type-folder-workspace-editor') +export class UmbMemberTypeFolderWorkspaceEditorElement extends UmbLitElement { + override render() { + return html``; + } +} + +export { UmbMemberTypeFolderWorkspaceEditorElement as element }; + +declare global { + interface HTMLElementTagNameMap { + ['umb-member-type-folder-workspace-editor']: UmbMemberTypeFolderWorkspaceEditorElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/member-type-folder-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/member-type-folder-workspace.context.ts new file mode 100644 index 000000000000..00d5662c741f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/member-type-folder-workspace.context.ts @@ -0,0 +1,39 @@ +import { UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE } from '../../../entity.js'; +import { UMB_MEMBER_TYPE_FOLDER_REPOSITORY_ALIAS } from '../constants.js'; +import type { UmbMemberTypeFolderRepository } from '../repository/index.js'; +import { UMB_MEMBER_TYPE_FOLDER_WORKSPACE_ALIAS } from './constants.js'; +import { UmbMemberTypeFolderWorkspaceEditorElement } from './member-type-folder-editor.element.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { + UmbEntityNamedDetailWorkspaceContextBase, + type UmbRoutableWorkspaceContext, + type UmbSubmittableWorkspaceContext, +} from '@umbraco-cms/backoffice/workspace'; +import type { IRoutingInfo, PageComponent } from '@umbraco-cms/backoffice/router'; +import type { UmbFolderModel } from '@umbraco-cms/backoffice/tree'; + +export class UmbMemberTypeFolderWorkspaceContext + extends UmbEntityNamedDetailWorkspaceContextBase + implements UmbSubmittableWorkspaceContext, UmbRoutableWorkspaceContext +{ + constructor(host: UmbControllerHost) { + super(host, { + workspaceAlias: UMB_MEMBER_TYPE_FOLDER_WORKSPACE_ALIAS, + entityType: UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE, + detailRepositoryAlias: UMB_MEMBER_TYPE_FOLDER_REPOSITORY_ALIAS, + }); + + this.routes.setRoutes([ + { + path: 'edit/:unique', + component: UmbMemberTypeFolderWorkspaceEditorElement, + setup: (component: PageComponent, info: IRoutingInfo) => { + const unique = info.match.params.unique; + this.load(unique); + }, + }, + ]); + } +} + +export { UmbMemberTypeFolderWorkspaceContext as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/member-type-folder.workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/member-type-folder.workspace.context-token.ts new file mode 100644 index 000000000000..0005cae94628 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/member-type-folder.workspace.context-token.ts @@ -0,0 +1,14 @@ +import { UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE } from '../../../entity.js'; +import type { UmbMemberTypeFolderWorkspaceContext } from './member-type-folder-workspace.context.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import type { UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; + +export const UMB_MEMBER_TYPE_FOLDER_WORKSPACE_CONTEXT = new UmbContextToken< + UmbWorkspaceContext, + UmbMemberTypeFolderWorkspaceContext +>( + 'UmbWorkspaceContext', + undefined, + (context): context is UmbMemberTypeFolderWorkspaceContext => + context.getEntityType?.() === UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/paths.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/paths.ts new file mode 100644 index 000000000000..98c249edb321 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/folder/workspace/paths.ts @@ -0,0 +1,14 @@ +import { UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE } from '../../../entity.js'; +import { UmbPathPattern } from '@umbraco-cms/backoffice/router'; +import { UMB_SETTINGS_SECTION_PATHNAME } from '@umbraco-cms/backoffice/settings'; +import { UMB_WORKSPACE_PATH_PATTERN } from '@umbraco-cms/backoffice/workspace'; + +export const UMB_MEMBER_TYPE_FOLDER_WORKSPACE_PATH = UMB_WORKSPACE_PATH_PATTERN.generateAbsolute({ + sectionName: UMB_SETTINGS_SECTION_PATHNAME, + entityType: UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE, +}); + +export const UMB_EDIT_MEMBER_TYPE_FOLDER_WORKSPACE_PATH_PATTERN = new UmbPathPattern<{ unique: string }>( + 'edit/:unique', + UMB_MEMBER_TYPE_FOLDER_WORKSPACE_PATH, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/manifests.ts index 8094f2ad619f..f9a41aed4a20 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/manifests.ts @@ -1,13 +1,11 @@ -import { UMB_MEMBER_TYPE_ROOT_WORKSPACE_ALIAS } from '../constants.js'; import { UMB_MEMBER_TYPE_ENTITY_TYPE, UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE } from '../entity.js'; import { UMB_MEMBER_TYPE_TREE_ALIAS, - UMB_MEMBER_TYPE_TREE_ITEM_CHILDREN_COLLECTION_ALIAS, UMB_MEMBER_TYPE_TREE_REPOSITORY_ALIAS, UMB_MEMBER_TYPE_TREE_STORE_ALIAS, } from './constants.js'; -import { manifests as treeItemChildrenManifest } from './tree-item-children/manifests.js'; -import { UMB_WORKSPACE_CONDITION_ALIAS } from '@umbraco-cms/backoffice/workspace'; +import { manifests as folderManifests } from './folder/manifests.js'; +import { manifests as treeItemChildrenManifests } from './tree-item-children/manifests.js'; export const manifests: Array = [ { @@ -38,23 +36,6 @@ export const manifests: Array = [ name: 'Member Type Tree Item', forEntityTypes: [UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE, UMB_MEMBER_TYPE_ENTITY_TYPE], }, - { - type: 'workspaceView', - kind: 'collection', - alias: 'Umb.WorkspaceView.MemberType.TreeItemChildrenCollection', - name: 'Member Type Tree Item Children Collection Workspace View', - meta: { - label: '#general_design', - pathname: 'design', - icon: 'icon-member-dashed-line', - collectionAlias: UMB_MEMBER_TYPE_TREE_ITEM_CHILDREN_COLLECTION_ALIAS, - }, - conditions: [ - { - alias: UMB_WORKSPACE_CONDITION_ALIAS, - oneOf: [UMB_MEMBER_TYPE_ROOT_WORKSPACE_ALIAS], - }, - ], - }, - ...treeItemChildrenManifest, + ...folderManifests, + ...treeItemChildrenManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.repository.ts index a53f5a914d6e..a422faed3e3f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.repository.ts @@ -1,5 +1,5 @@ import { UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE } from '../entity.js'; -import { UmbMemberTypeTreeServerDataSource } from './member-type-tree.server.data-source.js'; +import { UmbMemberTypeTreeServerDataSource } from './server-data-source/member-type-tree.server.data-source.js'; import type { UmbMemberTypeTreeItemModel, UmbMemberTypeTreeRootModel } from './types.js'; import { UMB_MEMBER_TYPE_TREE_STORE_CONTEXT } from './member-type-tree.store.context-token.js'; import { UmbTreeRepositoryBase } from '@umbraco-cms/backoffice/tree'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.server.data-source.ts deleted file mode 100644 index f83401985ee7..000000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.server.data-source.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { UMB_MEMBER_TYPE_ENTITY_TYPE, UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE } from '../entity.js'; -import type { UmbMemberTypeTreeItemModel } from './types.js'; -import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; -import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; -import type { MemberTypeTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { MemberTypeService } from '@umbraco-cms/backoffice/external/backend-api'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; - -/** - * A data source for the MemberType tree that fetches data from the server - * @class UmbMemberTypeTreeServerDataSource - * @implements {UmbTreeDataSource} - */ -export class UmbMemberTypeTreeServerDataSource extends UmbTreeServerDataSourceBase< - MemberTypeTreeItemResponseModel, - UmbMemberTypeTreeItemModel -> { - /** - * Creates an instance of UmbMemberTypeTreeServerDataSource. - * @param {UmbControllerHost} host - The controller host for this controller to be appended to - * @memberof UmbMemberTypeTreeServerDataSource - */ - constructor(host: UmbControllerHost) { - super(host, { - getRootItems, - getChildrenOf, - getAncestorsOf, - mapper, - }); - } -} - -const getRootItems = (args: UmbTreeRootItemsRequestArgs) => - // eslint-disable-next-line local-rules/no-direct-api-import - MemberTypeService.getTreeMemberTypeRoot({ query: { skip: args.skip, take: args.take } }); - -const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { - if (args.parent.unique === null) { - return getRootItems(args); - } else { - throw new Error('Not supported for the member type tree'); - } -}; - -const getAncestorsOf = () => { - throw new Error('Not supported for the member type tree'); -}; - -const mapper = (item: MemberTypeTreeItemResponseModel): UmbMemberTypeTreeItemModel => { - return { - unique: item.id, - parent: { - unique: item.parent ? item.parent.id : null, - entityType: item.parent ? UMB_MEMBER_TYPE_ENTITY_TYPE : UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE, - }, - name: item.name, - entityType: UMB_MEMBER_TYPE_ENTITY_TYPE, - hasChildren: item.hasChildren, - isFolder: false, - icon: item.icon, - }; -}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/server-data-source/member-type-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/server-data-source/member-type-tree.server.data-source.ts new file mode 100644 index 000000000000..b59add11fe33 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/server-data-source/member-type-tree.server.data-source.ts @@ -0,0 +1,75 @@ +import { + UMB_MEMBER_TYPE_ENTITY_TYPE, + UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE, + UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE, +} from '../../entity.js'; +import { UmbManagementApiMemberTypeTreeDataRequestManager } from './member-type-tree.server.request-manager.js'; +import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; +import type { MemberTypeTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; +import type { + UmbTreeAncestorsOfRequestArgs, + UmbTreeChildrenOfRequestArgs, + UmbTreeDataSource, + UmbTreeRootItemsRequestArgs, +} from '@umbraco-cms/backoffice/tree'; +import type { UmbMemberTypeTreeItemModel } from '../types.js'; + +/** + * A data source for the Member Type tree that fetches data from the server + * @class UmbMemberTypeTreeServerDataSource + */ +export class UmbMemberTypeTreeServerDataSource + extends UmbControllerBase + implements UmbTreeDataSource +{ + #treeRequestManager = new UmbManagementApiMemberTypeTreeDataRequestManager(this); + + async getRootItems(args: UmbTreeRootItemsRequestArgs) { + const { data, error } = await this.#treeRequestManager.getRootItems(args); + + const mappedData = data + ? { + ...data, + items: data?.items.map((item) => this.#mapItem(item)), + } + : undefined; + + return { data: mappedData, error }; + } + + async getChildrenOf(args: UmbTreeChildrenOfRequestArgs) { + const { data, error } = await this.#treeRequestManager.getChildrenOf(args); + + const mappedData = data + ? { + ...data, + items: data?.items.map((item) => this.#mapItem(item)), + } + : undefined; + + return { data: mappedData, error }; + } + + async getAncestorsOf(args: UmbTreeAncestorsOfRequestArgs) { + const { data, error } = await this.#treeRequestManager.getAncestorsOf(args); + + const mappedData = data?.map((item) => this.#mapItem(item)); + + return { data: mappedData, error }; + } + + #mapItem(item: MemberTypeTreeItemResponseModel): UmbMemberTypeTreeItemModel { + return { + unique: item.id, + parent: { + unique: item.parent ? item.parent.id : null, + entityType: item.parent ? UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE : UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE, + }, + name: item.name, + entityType: item.isFolder ? UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE : UMB_MEMBER_TYPE_ENTITY_TYPE, + hasChildren: item.hasChildren, + isFolder: item.isFolder, + icon: item.icon, + }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/server-data-source/member-type-tree.server.request-manager.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/server-data-source/member-type-tree.server.request-manager.ts new file mode 100644 index 000000000000..59efbfb42d71 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/server-data-source/member-type-tree.server.request-manager.ts @@ -0,0 +1,68 @@ +/* eslint-disable local-rules/no-direct-api-import */ + +import { MemberTypeService } from '@umbraco-cms/backoffice/external/backend-api'; +import { UmbManagementApiTreeDataRequestManager } from '@umbraco-cms/backoffice/management-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { + MemberTypeTreeItemResponseModel, + PagedMemberTypeTreeItemResponseModel, + SubsetMemberTypeTreeItemResponseModel, +} from '@umbraco-cms/backoffice/external/backend-api'; +import type { + UmbManagementApiTreeAncestorsOfRequestArgs, + UmbManagementApiTreeChildrenOfRequestArgs, + UmbManagementApiTreeRootItemsRequestArgs, + UmbManagementApiTreeSiblingsFromRequestArgs, +} from '@umbraco-cms/backoffice/management-api'; + +export class UmbManagementApiMemberTypeTreeDataRequestManager extends UmbManagementApiTreeDataRequestManager< + MemberTypeTreeItemResponseModel, + UmbManagementApiTreeRootItemsRequestArgs, + PagedMemberTypeTreeItemResponseModel, + UmbManagementApiTreeChildrenOfRequestArgs, + PagedMemberTypeTreeItemResponseModel, + UmbManagementApiTreeAncestorsOfRequestArgs, + Array, + UmbManagementApiTreeSiblingsFromRequestArgs, + SubsetMemberTypeTreeItemResponseModel +> { + constructor(host: UmbControllerHost) { + super(host, { + getRootItems: (args) => + MemberTypeService.getTreeMemberTypeRoot({ + query: { + foldersOnly: args.foldersOnly, + skip: args.paging.skip, + take: args.paging.take, + }, + }), + + getChildrenOf: (args) => + MemberTypeService.getTreeMemberTypeChildren({ + query: { + parentId: args.parent.unique, + foldersOnly: args.foldersOnly, + skip: args.paging.skip, + take: args.paging.take, + }, + }), + + getAncestorsOf: (args) => + MemberTypeService.getTreeMemberTypeAncestors({ + query: { + descendantId: args.treeItem.unique, + }, + }), + + getSiblingsFrom: (args) => + MemberTypeService.getTreeMemberTypeSiblings({ + query: { + foldersOnly: args.foldersOnly, + target: args.paging.target.unique, + before: args.paging.takeBefore, + after: args.paging.takeAfter, + }, + }), + }); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/tree-item-children/collection/views/member-type-tree-item-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/tree-item-children/collection/views/member-type-tree-item-table-collection-view.element.ts index 07835f8c69bf..1d4809abd20e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/tree-item-children/collection/views/member-type-tree-item-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/tree-item-children/collection/views/member-type-tree-item-table-collection-view.element.ts @@ -76,7 +76,7 @@ export class UmbMemberTypeTreeItemTableCollectionViewElement extends UmbLitEleme return { id: item.unique, - icon: item.icon, + icon: item.isFolder && !item.icon ? 'icon-folder' : item.icon, data: [ { columnAlias: 'name', diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/tree-item-children/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/tree-item-children/manifests.ts index b6ea5ab54edd..768ac8c2e7f6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/tree-item-children/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/tree-item-children/manifests.ts @@ -1,4 +1,38 @@ +import { + UMB_MEMBER_TYPE_ENTITY_TYPE, + UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE, + UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE, +} from '../../entity.js'; +import { UMB_MEMBER_TYPE_ROOT_WORKSPACE_ALIAS } from '../../member-type-root/constants.js'; +import { UMB_MEMBER_TYPE_FOLDER_WORKSPACE_ALIAS } from '../folder/constants.js'; import { manifests as collectionManifests } from './collection/manifests.js'; -import { manifests as reloadEntityActionManifests } from './reload-entity-action/manifests.js'; +import { UMB_WORKSPACE_CONDITION_ALIAS } from '@umbraco-cms/backoffice/workspace'; -export const manifests: Array = [...collectionManifests, ...reloadEntityActionManifests]; +export const manifests: Array = [ + { + type: 'entityAction', + kind: 'reloadTreeItemChildren', + alias: 'Umb.EntityAction.MemberType.Tree.ReloadChildrenOf', + name: 'Reload Member Type Tree Item Children Entity Action', + forEntityTypes: [UMB_MEMBER_TYPE_ENTITY_TYPE, UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE, UMB_MEMBER_TYPE_FOLDER_ENTITY_TYPE], + }, + { + type: 'workspaceView', + kind: 'collection', + alias: 'Umb.WorkspaceView.MemberType.TreeItemChildrenCollection', + name: 'Member Type Tree Item Children Collection Workspace View', + meta: { + label: 'Folder', + pathname: 'folder', + icon: 'icon-folder', + collectionAlias: 'Umb.Collection.MemberType.TreeItemChildren', + }, + conditions: [ + { + alias: UMB_WORKSPACE_CONDITION_ALIAS, + oneOf: [UMB_MEMBER_TYPE_ROOT_WORKSPACE_ALIAS, UMB_MEMBER_TYPE_FOLDER_WORKSPACE_ALIAS], + }, + ], + }, + ...collectionManifests, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/tree-item-children/reload-entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/tree-item-children/reload-entity-action/manifests.ts deleted file mode 100644 index 79301de8d825..000000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/tree-item-children/reload-entity-action/manifests.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE } from '../../../entity.js'; - -export const manifests: Array = [ - { - type: 'entityAction', - kind: 'reloadTreeItemChildren', - alias: 'Umb.EntityAction.MemberType.Tree.ReloadChildrenOf', - name: 'Reload Member Type Tree Item Children Entity Action', - forEntityTypes: [UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE], - }, -]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/types.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/types.ts index a453e96de141..fbcc298d1684 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/types.ts @@ -1,10 +1,10 @@ -import type { UmbMemberTypeEntityType, UmbMemberTypeRootEntityType } from '../entity.js'; +import type { UmbMemberTypeEntityType, UmbMemberTypeFolderEntityType, UmbMemberTypeRootEntityType } from '../entity.js'; import type { UmbTreeItemModel, UmbTreeRootModel } from '@umbraco-cms/backoffice/tree'; export interface UmbMemberTypeTreeItemModel extends UmbTreeItemModel { - entityType: UmbMemberTypeEntityType; + entityType: UmbMemberTypeEntityType | UmbMemberTypeFolderEntityType; } export interface UmbMemberTypeTreeRootModel extends UmbTreeRootModel { entityType: UmbMemberTypeRootEntityType; -} +} \ No newline at end of file diff --git a/tests/Umbraco.Tests.Integration/ManagementApi/DocumentType/Root/ChildrenDocumentTypeTreeControllerTests.cs b/tests/Umbraco.Tests.Integration/ManagementApi/DocumentType/Tree/ChildrenDocumentTypeTreeControllerTests.cs similarity index 99% rename from tests/Umbraco.Tests.Integration/ManagementApi/DocumentType/Root/ChildrenDocumentTypeTreeControllerTests.cs rename to tests/Umbraco.Tests.Integration/ManagementApi/DocumentType/Tree/ChildrenDocumentTypeTreeControllerTests.cs index cf582000dfe6..3ddd36ca1e48 100644 --- a/tests/Umbraco.Tests.Integration/ManagementApi/DocumentType/Root/ChildrenDocumentTypeTreeControllerTests.cs +++ b/tests/Umbraco.Tests.Integration/ManagementApi/DocumentType/Tree/ChildrenDocumentTypeTreeControllerTests.cs @@ -7,7 +7,7 @@ using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.ContentTypeEditing; -namespace Umbraco.Cms.Tests.Integration.ManagementApi.DocumentType.Root; +namespace Umbraco.Cms.Tests.Integration.ManagementApi.DocumentType.Tree; public class ChildrenDocumentTypeTreeControllerTests : ManagementApiUserGroupTestBase { diff --git a/tests/Umbraco.Tests.Integration/ManagementApi/DocumentType/Root/RootDocumentTypeTreeControllerTests.cs b/tests/Umbraco.Tests.Integration/ManagementApi/DocumentType/Tree/RootDocumentTypeTreeControllerTests.cs similarity index 99% rename from tests/Umbraco.Tests.Integration/ManagementApi/DocumentType/Root/RootDocumentTypeTreeControllerTests.cs rename to tests/Umbraco.Tests.Integration/ManagementApi/DocumentType/Tree/RootDocumentTypeTreeControllerTests.cs index e4bac25c270a..a72c542bbc3d 100644 --- a/tests/Umbraco.Tests.Integration/ManagementApi/DocumentType/Root/RootDocumentTypeTreeControllerTests.cs +++ b/tests/Umbraco.Tests.Integration/ManagementApi/DocumentType/Tree/RootDocumentTypeTreeControllerTests.cs @@ -3,7 +3,7 @@ using Umbraco.Cms.Api.Management.Controllers.DocumentType.Tree; -namespace Umbraco.Cms.Tests.Integration.ManagementApi.DocumentType.Root; +namespace Umbraco.Cms.Tests.Integration.ManagementApi.DocumentType.Tree; public class RootDocumentTypeTreeControllerTests : ManagementApiUserGroupTestBase { diff --git a/tests/Umbraco.Tests.Integration/ManagementApi/MemberType/Tree/ChildrenMemberTypeTreeControllerTests.cs b/tests/Umbraco.Tests.Integration/ManagementApi/MemberType/Tree/ChildrenMemberTypeTreeControllerTests.cs new file mode 100644 index 000000000000..57213eb15c61 --- /dev/null +++ b/tests/Umbraco.Tests.Integration/ManagementApi/MemberType/Tree/ChildrenMemberTypeTreeControllerTests.cs @@ -0,0 +1,64 @@ +using System.Linq.Expressions; +using System.Net; +using NUnit.Framework; +using Umbraco.Cms.Api.Management.Controllers.MemberType.Tree; +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Models.ContentTypeEditing; +using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Core.Services.ContentTypeEditing; + +namespace Umbraco.Cms.Tests.Integration.ManagementApi.MemberType.Tree; + +public class ChildrenMemberTypeTreeControllerTests : ManagementApiUserGroupTestBase +{ + private IMemberTypeEditingService MemberTypeEditingService => GetRequiredService(); + + private IContentTypeContainerService ContentTypeContainerService => GetRequiredService(); + + private Guid _mediaTypeFolderKey; + private Guid _mediaTypeKey; + + [SetUp] + public async Task SetUp() + { + _mediaTypeFolderKey = Guid.NewGuid(); + await ContentTypeContainerService.CreateAsync(_mediaTypeFolderKey, "Folder", null, Constants.Security.SuperUserKey); + + _mediaTypeKey = Guid.NewGuid(); + MemberTypeCreateModel memberTypeCreateModel = new() { Name = Guid.NewGuid().ToString(), Alias = Guid.NewGuid().ToString(), Key = _mediaTypeKey, ContainerKey = _mediaTypeFolderKey }; + await MemberTypeEditingService.CreateAsync(memberTypeCreateModel, Constants.Security.SuperUserKey); + } + + protected override Expression> MethodSelector => + x => x.Children(CancellationToken.None, _mediaTypeFolderKey, 0, 100, false); + + protected override UserGroupAssertionModel AdminUserGroupAssertionModel => new() + { + ExpectedStatusCode = HttpStatusCode.OK + }; + + protected override UserGroupAssertionModel EditorUserGroupAssertionModel => new() + { + ExpectedStatusCode = HttpStatusCode.Forbidden + }; + + protected override UserGroupAssertionModel SensitiveDataUserGroupAssertionModel => new() + { + ExpectedStatusCode = HttpStatusCode.Forbidden + }; + + protected override UserGroupAssertionModel TranslatorUserGroupAssertionModel => new() + { + ExpectedStatusCode = HttpStatusCode.Forbidden + }; + + protected override UserGroupAssertionModel WriterUserGroupAssertionModel => new() + { + ExpectedStatusCode = HttpStatusCode.Forbidden + }; + + protected override UserGroupAssertionModel UnauthorizedUserGroupAssertionModel => new() + { + ExpectedStatusCode = HttpStatusCode.Unauthorized + }; +}