* Return not found when request for content references when entity does not exist. * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Move check for entity existence from controller to the service. * Update OpenApi.json. * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Addressed points raised in code review. * Update OpenApi.json * Resolved breaking changes. --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
80 lines
3.3 KiB
C#
80 lines
3.3 KiB
C#
using Asp.Versioning;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Umbraco.Cms.Api.Common.ViewModels.Pagination;
|
|
using Umbraco.Cms.Api.Management.ViewModels;
|
|
using Umbraco.Cms.Core;
|
|
using Umbraco.Cms.Core.Mapping;
|
|
using Umbraco.Cms.Core.Models;
|
|
using Umbraco.Cms.Core.Services;
|
|
using Umbraco.Cms.Core.Services.OperationStatus;
|
|
|
|
namespace Umbraco.Cms.Api.Management.Controllers.Document.References;
|
|
|
|
[ApiVersion("1.0")]
|
|
public class ReferencedDescendantsDocumentController : DocumentControllerBase
|
|
{
|
|
private readonly ITrackedReferencesService _trackedReferencesSkipTakeService;
|
|
private readonly IUmbracoMapper _umbracoMapper;
|
|
|
|
public ReferencedDescendantsDocumentController(
|
|
ITrackedReferencesService trackedReferencesSkipTakeService,
|
|
IUmbracoMapper umbracoMapper)
|
|
{
|
|
_trackedReferencesSkipTakeService = trackedReferencesSkipTakeService;
|
|
_umbracoMapper = umbracoMapper;
|
|
}
|
|
|
|
[Obsolete("Use the ReferencedDescendants2 action method instead. Scheduled for removal in Umbraco 19, when ReferencedDescendants2 will be renamed back to ReferencedDescendants.")]
|
|
[NonAction]
|
|
public async Task<ActionResult<PagedViewModel<ReferenceByIdModel>>> ReferencedDescendants(
|
|
CancellationToken cancellationToken,
|
|
Guid id,
|
|
int skip = 0,
|
|
int take = 20)
|
|
{
|
|
PagedModel<RelationItemModel> relationItems = await _trackedReferencesSkipTakeService.GetPagedDescendantsInReferencesAsync(id, skip, take, true);
|
|
var pagedViewModel = new PagedViewModel<ReferenceByIdModel>
|
|
{
|
|
Total = relationItems.Total,
|
|
Items = _umbracoMapper.MapEnumerable<RelationItemModel, ReferenceByIdModel>(relationItems.Items),
|
|
};
|
|
|
|
return pagedViewModel;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets a paged list of the descendant nodes of the current item used in any kind of relation.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Used when deleting and unpublishing a single item to check if this item has any descending items that are in any
|
|
/// kind of relation.
|
|
/// This is basically finding the descending items which are children in relations.
|
|
/// </remarks>
|
|
[HttpGet("{id:guid}/referenced-descendants")]
|
|
[MapToApiVersion("1.0")]
|
|
[ProducesResponseType(typeof(PagedViewModel<ReferenceByIdModel>), StatusCodes.Status200OK)]
|
|
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
|
|
public async Task<IActionResult> ReferencedDescendants2(
|
|
CancellationToken cancellationToken,
|
|
Guid id,
|
|
int skip = 0,
|
|
int take = 20)
|
|
{
|
|
Attempt<PagedModel<RelationItemModel>, GetReferencesOperationStatus> relationItemsAttempt = await _trackedReferencesSkipTakeService.GetPagedDescendantsInReferencesAsync(id, UmbracoObjectTypes.Document, skip, take, true);
|
|
|
|
if (relationItemsAttempt.Success is false)
|
|
{
|
|
return GetReferencesOperationStatusResult(relationItemsAttempt.Status);
|
|
}
|
|
|
|
var pagedViewModel = new PagedViewModel<ReferenceByIdModel>
|
|
{
|
|
Total = relationItemsAttempt.Result.Total,
|
|
Items = _umbracoMapper.MapEnumerable<RelationItemModel, ReferenceByIdModel>(relationItemsAttempt.Result.Items),
|
|
};
|
|
|
|
return Ok(pagedViewModel);
|
|
}
|
|
}
|