diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Member/FilterMemberController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Member/Filter/FilterMemberFilterController.cs similarity index 84% rename from src/Umbraco.Cms.Api.Management/Controllers/Member/FilterMemberController.cs rename to src/Umbraco.Cms.Api.Management/Controllers/Member/Filter/FilterMemberFilterController.cs index b4936dee5e..bba4750061 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Member/FilterMemberController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Member/Filter/FilterMemberFilterController.cs @@ -7,18 +7,17 @@ using Umbraco.Cms.Api.Management.ViewModels.Member; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services; -using Umbraco.Cms.Core.Services.OperationStatus; -namespace Umbraco.Cms.Api.Management.Controllers.Member; +namespace Umbraco.Cms.Api.Management.Controllers.Member.Filter; [ApiVersion("1.0")] -public class FilterMemberController : MemberControllerBase +public class FilterMemberFilterController : MemberFilterControllerBase { private readonly IMemberTypeService _memberTypeService; private readonly IMemberService _memberService; private readonly IMemberPresentationFactory _memberPresentationFactory; - public FilterMemberController( + public FilterMemberFilterController( IMemberTypeService memberTypeService, IMemberService memberService, IMemberPresentationFactory memberPresentationFactory) @@ -28,10 +27,9 @@ public class FilterMemberController : MemberControllerBase _memberPresentationFactory = memberPresentationFactory; } - [HttpGet("filter")] + [HttpGet] [MapToApiVersion("1.0")] [ProducesResponseType(typeof(PagedViewModel), StatusCodes.Status200OK)] - [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] public async Task Filter( Guid? memberTypeId = null, @@ -48,7 +46,7 @@ public class FilterMemberController : MemberControllerBase IMemberType? memberType = await _memberTypeService.GetAsync(memberTypeId.Value); if (memberType == null) { - return MemberEditingOperationStatusResult(MemberEditingOperationStatus.MemberTypeNotFound); + return MemberTypeNotFound(); } memberTypeAlias = memberType.Alias; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Member/Filter/MemberFilterControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Member/Filter/MemberFilterControllerBase.cs new file mode 100644 index 0000000000..80b1def4c6 --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/Controllers/Member/Filter/MemberFilterControllerBase.cs @@ -0,0 +1,21 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Umbraco.Cms.Api.Management.Routing; +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Services.OperationStatus; +using Umbraco.Cms.Web.Common.Authorization; + +namespace Umbraco.Cms.Api.Management.Controllers.Member.Filter; + +[ApiController] +[VersionedApiBackOfficeRoute($"{Constants.Web.RoutePath.Filter}/{Constants.UdiEntityType.Member}")] +[ApiExplorerSettings(GroupName = nameof(Constants.UdiEntityType.Member))] +[Authorize(Policy = "New" + AuthorizationPolicies.SectionAccessForMemberTree)] +public abstract class MemberFilterControllerBase : ManagementApiControllerBase +{ + protected IActionResult MemberTypeNotFound() + => OperationStatusResult(ContentEditingOperationStatus.NotFound, problemDetailsBuilder + => NotFound(problemDetailsBuilder + .WithTitle("The requested member type could not be found") + .Build())); +} diff --git a/src/Umbraco.Cms.Api.Management/Controllers/TemporaryFile/TemporaryFileControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/TemporaryFile/TemporaryFileControllerBase.cs index 4e167fd342..a5dc4615bf 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/TemporaryFile/TemporaryFileControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/TemporaryFile/TemporaryFileControllerBase.cs @@ -7,7 +7,7 @@ using Umbraco.Cms.Core.Services.OperationStatus; namespace Umbraco.Cms.Api.Management.Controllers.TemporaryFile; [ApiController] -[VersionedApiBackOfficeRoute("temporaryfile")] +[VersionedApiBackOfficeRoute("temporary-file")] [ApiExplorerSettings(GroupName = "Temporary File")] public abstract class TemporaryFileControllerBase : ManagementApiControllerBase { diff --git a/src/Umbraco.Cms.Api.Management/Controllers/User/FilterUserController.cs b/src/Umbraco.Cms.Api.Management/Controllers/User/Filter/FilterUserFilterController.cs similarity index 94% rename from src/Umbraco.Cms.Api.Management/Controllers/User/FilterUserController.cs rename to src/Umbraco.Cms.Api.Management/Controllers/User/Filter/FilterUserFilterController.cs index 1a81dfdf93..816e90ed08 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/User/FilterUserController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/User/Filter/FilterUserFilterController.cs @@ -11,16 +11,16 @@ using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.OperationStatus; -namespace Umbraco.Cms.Api.Management.Controllers.User; +namespace Umbraco.Cms.Api.Management.Controllers.User.Filter; [ApiVersion("1.0")] -public class FilterUserController : UserControllerBase +public class FilterUserFilterController : UserFilterControllerBase { private readonly IUserService _userService; private readonly IBackOfficeSecurityAccessor _backOfficeSecurityAccessor; private readonly IUserPresentationFactory _userPresentationFactory; - public FilterUserController( + public FilterUserFilterController( IUserService userService, IBackOfficeSecurityAccessor backOfficeSecurityAccessor, IUserPresentationFactory userPresentationFactory) @@ -41,7 +41,7 @@ public class FilterUserController : UserControllerBase /// User states to include in the result. /// A string that must be present in the users name or username. /// A paged result of the users matching the query. - [HttpGet("filter")] + [HttpGet] [MapToApiVersion("1.0")] [ProducesResponseType(typeof(PagedViewModel), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/User/Filter/UserFilterControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/User/Filter/UserFilterControllerBase.cs new file mode 100644 index 0000000000..9b58d64567 --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/Controllers/User/Filter/UserFilterControllerBase.cs @@ -0,0 +1,14 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Umbraco.Cms.Api.Management.Routing; +using Umbraco.Cms.Core; +using Umbraco.Cms.Web.Common.Authorization; + +namespace Umbraco.Cms.Api.Management.Controllers.User.Filter; + +[ApiController] +[VersionedApiBackOfficeRoute($"{Constants.Web.RoutePath.Filter}/user")] +[Authorize(Policy = "New" + AuthorizationPolicies.SectionAccessUsers)] +public abstract class UserFilterControllerBase : UserOrCurrentUserControllerBase +{ +} diff --git a/src/Umbraco.Cms.Api.Management/Controllers/User/UserControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/User/UserControllerBase.cs index 742afebbd4..619cd812ef 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/User/UserControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/User/UserControllerBase.cs @@ -1,12 +1,13 @@ using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Management.Routing; using Umbraco.Cms.Web.Common.Authorization; namespace Umbraco.Cms.Api.Management.Controllers.User; +[ApiController] [VersionedApiBackOfficeRoute("user")] [Authorize(Policy = "New" + AuthorizationPolicies.SectionAccessUsers)] public abstract class UserControllerBase : UserOrCurrentUserControllerBase { - } diff --git a/src/Umbraco.Cms.Api.Management/OpenApi.json b/src/Umbraco.Cms.Api.Management/OpenApi.json index 2477d7fe6d..376f5c6d39 100644 --- a/src/Umbraco.Cms.Api.Management/OpenApi.json +++ b/src/Umbraco.Cms.Api.Management/OpenApi.json @@ -12845,6 +12845,114 @@ ] } }, + "/umbraco/management/api/v1/filter/member": { + "get": { + "tags": [ + "Member" + ], + "operationId": "GetFilterMember", + "parameters": [ + { + "name": "memberTypeId", + "in": "query", + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "orderBy", + "in": "query", + "schema": { + "type": "string", + "default": "username" + } + }, + { + "name": "orderDirection", + "in": "query", + "schema": { + "$ref": "#/components/schemas/DirectionModel" + } + }, + { + "name": "filter", + "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 + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PagedMemberResponseModel" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/PagedMemberResponseModel" + } + }, + "text/plain": { + "schema": { + "$ref": "#/components/schemas/PagedMemberResponseModel" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "text/plain": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "The resource is protected and requires an authentication token" + } + }, + "security": [ + { + "Backoffice User": [ ] + } + ] + } + }, "/umbraco/management/api/v1/item/member": { "get": { "tags": [ @@ -13382,134 +13490,6 @@ ] } }, - "/umbraco/management/api/v1/member/filter": { - "get": { - "tags": [ - "Member" - ], - "operationId": "GetMemberFilter", - "parameters": [ - { - "name": "memberTypeId", - "in": "query", - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "orderBy", - "in": "query", - "schema": { - "type": "string", - "default": "username" - } - }, - { - "name": "orderDirection", - "in": "query", - "schema": { - "$ref": "#/components/schemas/DirectionModel" - } - }, - { - "name": "filter", - "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 - } - } - ], - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PagedMemberResponseModel" - } - }, - "text/json": { - "schema": { - "$ref": "#/components/schemas/PagedMemberResponseModel" - } - }, - "text/plain": { - "schema": { - "$ref": "#/components/schemas/PagedMemberResponseModel" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - }, - "text/json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - }, - "text/plain": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - }, - "text/json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - }, - "text/plain": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - } - } - }, - "401": { - "description": "The resource is protected and requires an authentication token" - } - }, - "security": [ - { - "Backoffice User": [ ] - } - ] - } - }, "/umbraco/management/api/v1/member/validate": { "post": { "tags": [ @@ -20544,12 +20524,12 @@ ] } }, - "/umbraco/management/api/v1/temporaryfile": { + "/umbraco/management/api/v1/temporary-file": { "post": { "tags": [ "Temporary File" ], - "operationId": "PostTemporaryfile", + "operationId": "PostTemporaryFile", "requestBody": { "content": { "multipart/form-data": { @@ -20629,12 +20609,12 @@ ] } }, - "/umbraco/management/api/v1/temporaryfile/{id}": { + "/umbraco/management/api/v1/temporary-file/{id}": { "get": { "tags": [ "Temporary File" ], - "operationId": "GetTemporaryfileById", + "operationId": "GetTemporaryFileById", "parameters": [ { "name": "id", @@ -20733,7 +20713,7 @@ "tags": [ "Temporary File" ], - "operationId": "DeleteTemporaryfileById", + "operationId": "DeleteTemporaryFileById", "parameters": [ { "name": "id", @@ -20800,12 +20780,12 @@ ] } }, - "/umbraco/management/api/v1/temporaryfile/configuration": { + "/umbraco/management/api/v1/temporary-file/configuration": { "get": { "tags": [ "Temporary File" ], - "operationId": "GetTemporaryfileConfiguration", + "operationId": "GetTemporaryFileConfiguration", "responses": { "200": { "description": "Success" @@ -21959,6 +21939,149 @@ ] } }, + "/umbraco/management/api/v1/filter/user": { + "get": { + "tags": [ + "User" + ], + "operationId": "GetFilterUser", + "parameters": [ + { + "name": "skip", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 0 + } + }, + { + "name": "take", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 100 + } + }, + { + "name": "orderBy", + "in": "query", + "schema": { + "$ref": "#/components/schemas/UserOrderModel" + } + }, + { + "name": "orderDirection", + "in": "query", + "schema": { + "$ref": "#/components/schemas/DirectionModel" + } + }, + { + "name": "userGroupIds", + "in": "query", + "schema": { + "uniqueItems": true, + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } + } + }, + { + "name": "userStates", + "in": "query", + "schema": { + "uniqueItems": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/UserStateModel" + } + } + }, + { + "name": "filter", + "in": "query", + "schema": { + "type": "string", + "default": "" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PagedUserResponseModel" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/PagedUserResponseModel" + } + }, + "text/plain": { + "schema": { + "$ref": "#/components/schemas/PagedUserResponseModel" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "text/plain": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "text/plain": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "The resource is protected and requires an authentication token" + } + }, + "security": [ + { + "Backoffice User": [ ] + } + ] + } + }, "/umbraco/management/api/v1/item/user": { "get": { "tags": [ @@ -23850,149 +23973,6 @@ ] } }, - "/umbraco/management/api/v1/user/filter": { - "get": { - "tags": [ - "User" - ], - "operationId": "GetUserFilter", - "parameters": [ - { - "name": "skip", - "in": "query", - "schema": { - "type": "integer", - "format": "int32", - "default": 0 - } - }, - { - "name": "take", - "in": "query", - "schema": { - "type": "integer", - "format": "int32", - "default": 100 - } - }, - { - "name": "orderBy", - "in": "query", - "schema": { - "$ref": "#/components/schemas/UserOrderModel" - } - }, - { - "name": "orderDirection", - "in": "query", - "schema": { - "$ref": "#/components/schemas/DirectionModel" - } - }, - { - "name": "userGroupIds", - "in": "query", - "schema": { - "uniqueItems": true, - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } - } - }, - { - "name": "userStates", - "in": "query", - "schema": { - "uniqueItems": true, - "type": "array", - "items": { - "$ref": "#/components/schemas/UserStateModel" - } - } - }, - { - "name": "filter", - "in": "query", - "schema": { - "type": "string", - "default": "" - } - } - ], - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PagedUserResponseModel" - } - }, - "text/json": { - "schema": { - "$ref": "#/components/schemas/PagedUserResponseModel" - } - }, - "text/plain": { - "schema": { - "$ref": "#/components/schemas/PagedUserResponseModel" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - }, - "text/json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - }, - "text/plain": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - }, - "text/json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - }, - "text/plain": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - } - } - }, - "401": { - "description": "The resource is protected and requires an authentication token" - } - }, - "security": [ - { - "Backoffice User": [ ] - } - ] - } - }, "/umbraco/management/api/v1/user/invite": { "post": { "tags": [ diff --git a/src/Umbraco.Core/Constants-Web.cs b/src/Umbraco.Core/Constants-Web.cs index 3577448237..b7398778a5 100644 --- a/src/Umbraco.Core/Constants-Web.cs +++ b/src/Umbraco.Core/Constants-Web.cs @@ -75,6 +75,7 @@ public static partial class Constants public const string RecycleBin = "recycle-bin"; public const string Item = "item"; public const string Collection = "collection"; + public const string Filter = "filter"; } public static class AttributeRouting