Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

V14/feature/response model type info improvements #14962

Closed
Expand Up @@ -19,8 +19,8 @@ public ChildrenDictionaryTreeController(IEntityService entityService, IDictionar

[HttpGet("children")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<EntityTreeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<EntityTreeItemResponseModel>>> Children(Guid parentId, int skip = 0, int take = 100)
[ProducesResponseType(typeof(PagedViewModel<DictionaryTreeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<DictionaryTreeItemResponseModel>>> Children(Guid parentId, int skip = 0, int take = 100)
{
if (PaginationService.ConvertSkipTakeToPaging(skip, take, out var pageNumber, out var pageSize, out ProblemDetails? error) == false)
{
Expand All @@ -33,9 +33,9 @@ public async Task<ActionResult<PagedViewModel<EntityTreeItemResponseModel>>> Chi
await DictionaryItemService.GetChildrenAsync(parentId),
out var totalItems);

EntityTreeItemResponseModel[] viewModels = await MapTreeItemViewModels(parentId, dictionaryItems);
DictionaryTreeItemResponseModel[] viewModels = await MapTreeItemViewModels(parentId, dictionaryItems);

PagedViewModel<EntityTreeItemResponseModel> result = PagedViewModel(viewModels, totalItems);
PagedViewModel<DictionaryTreeItemResponseModel> result = PagedViewModel(viewModels, totalItems);
return await Task.FromResult(Ok(result));
}
}
Expand Up @@ -16,7 +16,7 @@ namespace Umbraco.Cms.Api.Management.Controllers.Dictionary.Tree;
[Authorize(Policy = "New" + AuthorizationPolicies.TreeAccessDictionaryOrTemplates)]
// NOTE: at the moment dictionary items (renamed to dictionary tree) aren't supported by EntityService, so we have little use of the
// tree controller base. We'll keep it though, in the hope that we can mend EntityService.
public class DictionaryTreeControllerBase : EntityTreeControllerBase<EntityTreeItemResponseModel>
public class DictionaryTreeControllerBase : EntityTreeControllerBase<DictionaryTreeItemResponseModel>
{
public DictionaryTreeControllerBase(IEntityService entityService, IDictionaryItemService dictionaryItemService)
: base(entityService) =>
Expand All @@ -27,23 +27,22 @@ public DictionaryTreeControllerBase(IEntityService entityService, IDictionaryIte

protected IDictionaryItemService DictionaryItemService { get; }

protected async Task<EntityTreeItemResponseModel[]> MapTreeItemViewModels(Guid? parentKey, IDictionaryItem[] dictionaryItems)
protected async Task<DictionaryTreeItemResponseModel[]> MapTreeItemViewModels(Guid? parentKey, IDictionaryItem[] dictionaryItems)
{
async Task<EntityTreeItemResponseModel> CreateEntityTreeItemViewModelAsync(IDictionaryItem dictionaryItem)
async Task<DictionaryTreeItemResponseModel> CreateEntityTreeItemViewModelAsync(IDictionaryItem dictionaryItem)
{
var hasChildren = (await DictionaryItemService.GetChildrenAsync(dictionaryItem.Key)).Any();
return new EntityTreeItemResponseModel
return new DictionaryTreeItemResponseModel()
{
Name = dictionaryItem.ItemKey,
Id = dictionaryItem.Key,
Type = Constants.UdiEntityType.DictionaryItem,
HasChildren = hasChildren,
IsContainer = false,
ParentId = parentKey
};
}

var items = new List<EntityTreeItemResponseModel>(dictionaryItems.Length);
var items = new List<DictionaryTreeItemResponseModel>(dictionaryItems.Length);
foreach (IDictionaryItem dictionaryItem in dictionaryItems)
{
items.Add(await CreateEntityTreeItemViewModelAsync(dictionaryItem));
Expand Down
Expand Up @@ -19,8 +19,8 @@ public RootDictionaryTreeController(IEntityService entityService, IDictionaryIte

[HttpGet("root")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<EntityTreeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<EntityTreeItemResponseModel>>> Root(int skip = 0, int take = 100)
[ProducesResponseType(typeof(PagedViewModel<DictionaryTreeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<DictionaryTreeItemResponseModel>>> Root(int skip = 0, int take = 100)
{
if (PaginationService.ConvertSkipTakeToPaging(skip, take, out var pageNumber, out var pageSize, out ProblemDetails? error) == false)
{
Expand All @@ -33,9 +33,9 @@ public async Task<ActionResult<PagedViewModel<EntityTreeItemResponseModel>>> Roo
await DictionaryItemService.GetAtRootAsync(),
out var totalItems);

EntityTreeItemResponseModel[] viewModels = await MapTreeItemViewModels(null, dictionaryItems);
DictionaryTreeItemResponseModel[] viewModels = await MapTreeItemViewModels(null, dictionaryItems);

PagedViewModel<EntityTreeItemResponseModel> result = PagedViewModel(viewModels, totalItems);
PagedViewModel<DictionaryTreeItemResponseModel> result = PagedViewModel(viewModels, totalItems);
return await Task.FromResult(Ok(result));
}
}
Expand Up @@ -17,7 +17,7 @@ public ChildrenDocumentRecycleBinController(IEntityService entityService)

[HttpGet("children")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<RecycleBinItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<RecycleBinItemResponseModel>>> Children(Guid parentId, int skip = 0, int take = 100)
[ProducesResponseType(typeof(PagedViewModel<DocumentRecycleBinItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<DocumentRecycleBinItemResponseModel>>> Children(Guid parentId, int skip = 0, int take = 100)
=> await GetChildren(parentId, skip, take);
}
Expand Up @@ -19,7 +19,7 @@ namespace Umbraco.Cms.Api.Management.Controllers.Document.RecycleBin;
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ApiExplorerSettings(GroupName = nameof(Constants.UdiEntityType.Document))]
[Authorize(Policy = "New" + AuthorizationPolicies.TreeAccessDocuments)]
public class DocumentRecycleBinControllerBase : RecycleBinControllerBase<RecycleBinItemResponseModel>
public class DocumentRecycleBinControllerBase : RecycleBinControllerBase<DocumentRecycleBinItemResponseModel>
{
public DocumentRecycleBinControllerBase(IEntityService entityService)
: base(entityService)
Expand All @@ -30,9 +30,9 @@ public DocumentRecycleBinControllerBase(IEntityService entityService)

protected override int RecycleBinRootId => Constants.System.RecycleBinContent;

protected override RecycleBinItemResponseModel MapRecycleBinViewModel(Guid? parentId, IEntitySlim entity)
protected override DocumentRecycleBinItemResponseModel MapRecycleBinViewModel(Guid? parentId, IEntitySlim entity)
{
RecycleBinItemResponseModel responseModel = base.MapRecycleBinViewModel(parentId, entity);
DocumentRecycleBinItemResponseModel responseModel = base.MapRecycleBinViewModel(parentId, entity);

if (entity is IDocumentEntitySlim documentEntitySlim)
{
Expand Down
Expand Up @@ -17,7 +17,7 @@ public RootDocumentRecycleBinController(IEntityService entityService)

[HttpGet("root")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<RecycleBinItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<RecycleBinItemResponseModel>>> Root(int skip = 0, int take = 100)
[ProducesResponseType(typeof(PagedViewModel<DocumentRecycleBinItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<DocumentRecycleBinItemResponseModel>>> Root(int skip = 0, int take = 100)
=> await GetRoot(skip, take);
}
Expand Up @@ -17,7 +17,7 @@ public ChildrenMediaRecycleBinController(IEntityService entityService)

[HttpGet("children")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<RecycleBinItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<RecycleBinItemResponseModel>>> Children(Guid parentId, int skip = 0, int take = 100)
[ProducesResponseType(typeof(PagedViewModel<MediaRecycleBinItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<MediaRecycleBinItemResponseModel>>> Children(Guid parentId, int skip = 0, int take = 100)
=> await GetChildren(parentId, skip, take);
}
Expand Up @@ -19,7 +19,7 @@ namespace Umbraco.Cms.Api.Management.Controllers.Media.RecycleBin;
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ApiExplorerSettings(GroupName = nameof(Constants.UdiEntityType.Media))]
[Authorize(Policy = "New" + AuthorizationPolicies.SectionAccessMedia)]
public class MediaRecycleBinControllerBase : RecycleBinControllerBase<RecycleBinItemResponseModel>
public class MediaRecycleBinControllerBase : RecycleBinControllerBase<MediaRecycleBinItemResponseModel>
{
public MediaRecycleBinControllerBase(IEntityService entityService)
: base(entityService)
Expand All @@ -30,9 +30,9 @@ public MediaRecycleBinControllerBase(IEntityService entityService)

protected override int RecycleBinRootId => Constants.System.RecycleBinMedia;

protected override RecycleBinItemResponseModel MapRecycleBinViewModel(Guid? parentKey, IEntitySlim entity)
protected override MediaRecycleBinItemResponseModel MapRecycleBinViewModel(Guid? parentKey, IEntitySlim entity)
{
RecycleBinItemResponseModel responseModel = base.MapRecycleBinViewModel(parentKey, entity);
MediaRecycleBinItemResponseModel responseModel = base.MapRecycleBinViewModel(parentKey, entity);

if (entity is IMediaEntitySlim mediaEntitySlim)
{
Expand Down
Expand Up @@ -17,7 +17,7 @@ public RootMediaRecycleBinController(IEntityService entityService)

[HttpGet("root")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<RecycleBinItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<RecycleBinItemResponseModel>>> Root(int skip = 0, int take = 100)
[ProducesResponseType(typeof(PagedViewModel<MediaRecycleBinItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<MediaRecycleBinItemResponseModel>>> Root(int skip = 0, int take = 100)
=> await GetRoot(skip, take);
}
Expand Up @@ -15,7 +15,7 @@ namespace Umbraco.Cms.Api.Management.Controllers.MemberGroup.Tree;
[VersionedApiBackOfficeRoute($"{Constants.Web.RoutePath.Tree}/{Constants.UdiEntityType.MemberGroup}")]
[ApiExplorerSettings(GroupName = "Member Group")]
[Authorize(Policy = "New" + AuthorizationPolicies.TreeAccessMemberGroups)]
public class MemberGroupTreeControllerBase : EntityTreeControllerBase<EntityTreeItemResponseModel>
public class MemberGroupTreeControllerBase : EntityTreeControllerBase<MemberGroupTreeItemResponseModel>
{
public MemberGroupTreeControllerBase(IEntityService entityService)
: base(entityService)
Expand All @@ -24,9 +24,9 @@ public MemberGroupTreeControllerBase(IEntityService entityService)

protected override UmbracoObjectTypes ItemObjectType => UmbracoObjectTypes.MemberGroup;

protected override EntityTreeItemResponseModel MapTreeItemViewModel(Guid? parentKey, IEntitySlim entity)
protected override MemberGroupTreeItemResponseModel MapTreeItemViewModel(Guid? parentKey, IEntitySlim entity)
{
EntityTreeItemResponseModel responseModel = base.MapTreeItemViewModel(parentKey, entity);
MemberGroupTreeItemResponseModel responseModel = base.MapTreeItemViewModel(parentKey, entity);
return responseModel;
}
}
Expand Up @@ -17,7 +17,7 @@ public RootMemberGroupTreeController(IEntityService entityService)

[HttpGet("root")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<EntityTreeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<EntityTreeItemResponseModel>>> Root(int skip = 0, int take = 100)
[ProducesResponseType(typeof(PagedViewModel<MemberGroupTreeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<MemberGroupTreeItemResponseModel>>> Root(int skip = 0, int take = 100)
=> await GetRoot(skip, take);
}
Expand Up @@ -15,7 +15,7 @@ namespace Umbraco.Cms.Api.Management.Controllers.MemberType.Tree;
[VersionedApiBackOfficeRoute($"{Constants.Web.RoutePath.Tree}/{Constants.UdiEntityType.MemberType}")]
[ApiExplorerSettings(GroupName = "Member Type")]
[Authorize(Policy = "New" + AuthorizationPolicies.TreeAccessMemberTypes)]
public class MemberTypeTreeControllerBase : EntityTreeControllerBase<EntityTreeItemResponseModel>
public class MemberTypeTreeControllerBase : EntityTreeControllerBase<MemberTypeTreeItemResponseModel>
{
public MemberTypeTreeControllerBase(IEntityService entityService)
: base(entityService)
Expand All @@ -24,9 +24,9 @@ public MemberTypeTreeControllerBase(IEntityService entityService)

protected override UmbracoObjectTypes ItemObjectType => UmbracoObjectTypes.MemberType;

protected override EntityTreeItemResponseModel MapTreeItemViewModel(Guid? parentKey, IEntitySlim entity)
protected override MemberTypeTreeItemResponseModel MapTreeItemViewModel(Guid? parentKey, IEntitySlim entity)
{
EntityTreeItemResponseModel responseModel = base.MapTreeItemViewModel(parentKey, entity);
MemberTypeTreeItemResponseModel responseModel = base.MapTreeItemViewModel(parentKey, entity);
return responseModel;
}
}
Expand Up @@ -17,7 +17,7 @@ public RootMemberTypeTreeController(IEntityService entityService)

[HttpGet("root")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<EntityTreeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<EntityTreeItemResponseModel>>> Root(int skip = 0, int take = 100)
[ProducesResponseType(typeof(PagedViewModel<MemberTypeTreeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<MemberTypeTreeItemResponseModel>>> Root(int skip = 0, int take = 100)
=> await GetRoot(skip, take);
}
Expand Up @@ -17,7 +17,7 @@ public ChildrenPartialViewTreeController(FileSystems fileSystems)

[HttpGet("children")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<FileSystemTreeItemPresentationModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<FileSystemTreeItemPresentationModel>>> Children(string path, int skip = 0, int take = 100)
[ProducesResponseType(typeof(PagedViewModel<PartialViewTreeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<PartialViewTreeItemResponseModel>>> Children(string path, int skip = 0, int take = 100)
=> await GetChildren(path, skip, take);
}
Expand Up @@ -4,6 +4,7 @@
using Umbraco.Cms.Core.IO;
using Umbraco.Cms.Api.Management.Controllers.Tree;
using Umbraco.Cms.Api.Management.Routing;
using Umbraco.Cms.Api.Management.ViewModels.Tree;
using Umbraco.Cms.Web.Common.Authorization;

namespace Umbraco.Cms.Api.Management.Controllers.PartialView.Tree;
Expand All @@ -12,13 +13,11 @@ namespace Umbraco.Cms.Api.Management.Controllers.PartialView.Tree;
[VersionedApiBackOfficeRoute($"{Constants.Web.RoutePath.Tree}/{Constants.UdiEntityType.PartialView}")]
[ApiExplorerSettings(GroupName = "Partial View")]
[Authorize(Policy = "New" + AuthorizationPolicies.TreeAccessPartialViews)]
public class PartialViewTreeControllerBase : FileSystemTreeControllerBase
public class PartialViewTreeControllerBase : FileSystemTreeControllerBase<PartialViewTreeItemResponseModel>
{
public PartialViewTreeControllerBase(FileSystems fileSystems)
=> FileSystem = fileSystems.PartialViewsFileSystem ??
throw new ArgumentException("Missing partial views file system", nameof(fileSystems));

protected override IFileSystem FileSystem { get; }

protected override string ItemType(string path) => Constants.UdiEntityType.PartialView;
}
Expand Up @@ -17,7 +17,7 @@ public RootPartialViewTreeController(FileSystems fileSystems)

[HttpGet("root")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<FileSystemTreeItemPresentationModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<FileSystemTreeItemPresentationModel>>> Root(int skip = 0, int take = 100)
[ProducesResponseType(typeof(PagedViewModel<PartialViewTreeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<PartialViewTreeItemResponseModel>>> Root(int skip = 0, int take = 100)
=> await GetRoot(skip, take);
}
Expand Up @@ -65,13 +65,11 @@ protected virtual TItem MapRecycleBinViewModel(Guid? parentKey, IEntitySlim enti

var viewModel = new TItem
{
Icon = _itemUdiType,
Name = entity.Name!,
Id = entity.Key,
Type = _itemUdiType,
HasChildren = entity.HasChildren,
IsContainer = entity.IsContainer,
ParentId = parentKey
ParentId = parentKey,
};

return viewModel;
Expand Down
Expand Up @@ -16,7 +16,7 @@ namespace Umbraco.Cms.Api.Management.Controllers.RelationType.Tree;
[Authorize(Policy = "New" + AuthorizationPolicies.TreeAccessRelationTypes)]
// NOTE: at the moment relation types aren't supported by EntityService, so we have little use of the
// tree controller base. We'll keep it though, in the hope that we can mend EntityService.
public class RelationTypeTreeControllerBase : EntityTreeControllerBase<EntityTreeItemResponseModel>
public class RelationTypeTreeControllerBase : EntityTreeControllerBase<RelationTypeTreeItemResponseModel>
{
public RelationTypeTreeControllerBase(IEntityService entityService)
: base(entityService)
Expand All @@ -25,12 +25,11 @@ public RelationTypeTreeControllerBase(IEntityService entityService)

protected override UmbracoObjectTypes ItemObjectType => UmbracoObjectTypes.RelationType;

protected EntityTreeItemResponseModel[] MapTreeItemViewModels(Guid? parentKey, IRelationType[] relationTypes)
=> relationTypes.Select(relationType => new EntityTreeItemResponseModel
protected RelationTypeTreeItemResponseModel[] MapTreeItemViewModels(Guid? parentKey, IRelationType[] relationTypes)
=> relationTypes.Select(relationType => new RelationTypeTreeItemResponseModel
{
Name = relationType.Name!,
Id = relationType.Key,
Type = Constants.UdiEntityType.RelationType,
HasChildren = false,
IsContainer = false,
ParentId = parentKey
Expand Down