Add endpoint for retrieving "folder" media types. (#16345)

* Add endpoint for retrieving "folder" media types.

* The system Folder media type should always be considered a "folder"
This commit is contained in:
Kenn Jacobsen
2024-05-23 14:43:00 +02:00
committed by GitHub
parent 228aab1154
commit 2b79d24afa
6 changed files with 214 additions and 1 deletions

View File

@@ -0,0 +1,37 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.MediaType.Item;
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Services.ContentTypeEditing;
namespace Umbraco.Cms.Api.Management.Controllers.MediaType.Item;
[ApiVersion("1.0")]
public class FolderMediaTypeItemController : MediaTypeItemControllerBase
{
private readonly IMediaTypeEditingService _mediaTypeEditingService;
private readonly IUmbracoMapper _mapper;
public FolderMediaTypeItemController(IMediaTypeEditingService mediaTypeEditingService, IUmbracoMapper mapper)
{
_mediaTypeEditingService = mediaTypeEditingService;
_mapper = mapper;
}
[HttpGet("folders")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedModel<MediaTypeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<IActionResult> Folders(CancellationToken cancellationToken, int skip = 0, int take = 100)
{
PagedModel<IMediaType> mediaTypes = await _mediaTypeEditingService.GetFolderMediaTypes(skip, take);
var result = new PagedModel<MediaTypeItemResponseModel>
{
Items = _mapper.MapEnumerable<IMediaType, MediaTypeItemResponseModel>(mediaTypes.Items),
Total = mediaTypes.Total
};
return Ok(result);
}
}

View File

@@ -13217,6 +13217,61 @@
]
}
},
"/umbraco/management/api/v1/item/media-type/folders": {
"get": {
"tags": [
"Media Type"
],
"operationId": "GetItemMediaTypeFolders",
"parameters": [
{
"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": {
"oneOf": [
{
"$ref": "#/components/schemas/PagedModelMediaTypeItemResponseModel"
}
]
}
}
}
},
"401": {
"description": "The resource is protected and requires an authentication token"
},
"403": {
"description": "The authenticated user do not have access to this resource"
}
},
"security": [
{
"Backoffice User": [ ]
}
]
}
},
"/umbraco/management/api/v1/item/media-type/search": {
"get": {
"tags": [
@@ -45027,4 +45082,4 @@
}
}
}
}
}

View File

@@ -16,4 +16,6 @@ public interface IMediaTypeEditingService
IEnumerable<string> currentPropertyAliases);
Task<PagedModel<IMediaType>> GetMediaTypesForFileExtensionAsync(string fileExtension, int skip, int take);
Task<PagedModel<IMediaType>> GetFolderMediaTypes(int skip, int take);
}

View File

@@ -102,6 +102,35 @@ internal sealed class MediaTypeEditingService : ContentTypeEditingServiceBase<IM
}
public Task<PagedModel<IMediaType>> GetFolderMediaTypes(int skip, int take)
{
// we'll consider it a "folder" media type if it:
// - does not contain an umbracoFile property
// - has any allowed types below itself
var folderMediaTypes = _mediaTypeService
.GetAll()
.Where(mt =>
mt.CompositionPropertyTypes.Any(pt => pt.Alias == Constants.Conventions.Media.File) is false
&& mt.AllowedContentTypes?.Any() is true)
.ToList();
// as a special case, the "Folder" system media type must always be included
if (folderMediaTypes.Any(mediaType => mediaType.Alias == Constants.Conventions.MediaTypes.Folder) is false)
{
IMediaType? defaultFolderMediaType = _mediaTypeService.Get(Constants.Conventions.MediaTypes.Folder);
if (defaultFolderMediaType is not null)
{
folderMediaTypes.Add(defaultFolderMediaType);
}
}
return Task.FromResult(new PagedModel<IMediaType>
{
Items = folderMediaTypes.Skip(skip).Take(take),
Total = folderMediaTypes.Count
});
}
protected override IMediaType CreateContentType(IShortStringHelper shortStringHelper, int parentId)
=> new MediaType(shortStringHelper, parentId);