From 7162efc865ae73eddf14c8ba26e11c897f17820c Mon Sep 17 00:00:00 2001 From: Mole Date: Mon, 25 Nov 2024 13:32:01 +0100 Subject: [PATCH] V15: Add information to item endpoints (#17623) * Add information to item response model * Update OpenApi.json --- .../Factories/DocumentPresentationFactory.cs | 11 +++++++-- .../Factories/MediaPresentationFactory.cs | 16 ++++++++++--- src/Umbraco.Cms.Api.Management/OpenApi.json | 24 +++++++++++++++++++ .../Item/DocumentItemResponseModel.cs | 4 ++++ .../Media/Item/MediaItemResponseModel.cs | 4 ++++ 5 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Cms.Api.Management/Factories/DocumentPresentationFactory.cs b/src/Umbraco.Cms.Api.Management/Factories/DocumentPresentationFactory.cs index 817cd9fa2e..463dbbd5ab 100644 --- a/src/Umbraco.Cms.Api.Management/Factories/DocumentPresentationFactory.cs +++ b/src/Umbraco.Cms.Api.Management/Factories/DocumentPresentationFactory.cs @@ -22,19 +22,22 @@ internal sealed class DocumentPresentationFactory : IDocumentPresentationFactory private readonly ITemplateService _templateService; private readonly IPublicAccessService _publicAccessService; private readonly TimeProvider _timeProvider; + private readonly IIdKeyMap _idKeyMap; public DocumentPresentationFactory( IUmbracoMapper umbracoMapper, IDocumentUrlFactory documentUrlFactory, ITemplateService templateService, IPublicAccessService publicAccessService, - TimeProvider timeProvider) + TimeProvider timeProvider, + IIdKeyMap idKeyMap) { _umbracoMapper = umbracoMapper; _documentUrlFactory = documentUrlFactory; _templateService = templateService; _publicAccessService = publicAccessService; _timeProvider = timeProvider; + _idKeyMap = idKeyMap; } public async Task CreateResponseModelAsync(IContent content) @@ -73,10 +76,14 @@ internal sealed class DocumentPresentationFactory : IDocumentPresentationFactory public DocumentItemResponseModel CreateItemResponseModel(IDocumentEntitySlim entity) { + Attempt parentKeyAttempt = _idKeyMap.GetKeyForId(entity.ParentId, UmbracoObjectTypes.Document); + var responseModel = new DocumentItemResponseModel { Id = entity.Key, - IsTrashed = entity.Trashed + IsTrashed = entity.Trashed, + Parent = parentKeyAttempt.Success ? new ReferenceByIdModel { Id = parentKeyAttempt.Result } : null, + HasChildren = entity.HasChildren, }; responseModel.IsProtected = _publicAccessService.IsProtected(entity.Path); diff --git a/src/Umbraco.Cms.Api.Management/Factories/MediaPresentationFactory.cs b/src/Umbraco.Cms.Api.Management/Factories/MediaPresentationFactory.cs index 7948e0d019..f9b4170281 100644 --- a/src/Umbraco.Cms.Api.Management/Factories/MediaPresentationFactory.cs +++ b/src/Umbraco.Cms.Api.Management/Factories/MediaPresentationFactory.cs @@ -1,10 +1,13 @@ -using Umbraco.Cms.Api.Management.ViewModels.Content; +using Umbraco.Cms.Api.Management.ViewModels; +using Umbraco.Cms.Api.Management.ViewModels.Content; using Umbraco.Cms.Api.Management.ViewModels.Media; using Umbraco.Cms.Api.Management.ViewModels.Media.Item; using Umbraco.Cms.Api.Management.ViewModels.MediaType; +using Umbraco.Cms.Core; using Umbraco.Cms.Core.Mapping; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Entities; +using Umbraco.Cms.Core.Services; namespace Umbraco.Cms.Api.Management.Factories; @@ -12,13 +15,16 @@ internal sealed class MediaPresentationFactory : IMediaPresentationFactory { private readonly IUmbracoMapper _umbracoMapper; private readonly IMediaUrlFactory _mediaUrlFactory; + private readonly IIdKeyMap _idKeyMap; public MediaPresentationFactory( IUmbracoMapper umbracoMapper, - IMediaUrlFactory mediaUrlFactory) + IMediaUrlFactory mediaUrlFactory, + IIdKeyMap idKeyMap) { _umbracoMapper = umbracoMapper; _mediaUrlFactory = mediaUrlFactory; + _idKeyMap = idKeyMap; } public MediaResponseModel CreateResponseModel(IMedia media) @@ -32,10 +38,14 @@ internal sealed class MediaPresentationFactory : IMediaPresentationFactory public MediaItemResponseModel CreateItemResponseModel(IMediaEntitySlim entity) { + Attempt parentKeyAttempt = _idKeyMap.GetKeyForId(entity.ParentId, UmbracoObjectTypes.Media); + var responseModel = new MediaItemResponseModel { Id = entity.Key, - IsTrashed = entity.Trashed + IsTrashed = entity.Trashed, + Parent = parentKeyAttempt.Success ? new ReferenceByIdModel { Id = parentKeyAttempt.Result } : null, + HasChildren = entity.HasChildren, }; responseModel.MediaType = _umbracoMapper.Map(entity)!; diff --git a/src/Umbraco.Cms.Api.Management/OpenApi.json b/src/Umbraco.Cms.Api.Management/OpenApi.json index a57ae45536..261279dc64 100644 --- a/src/Umbraco.Cms.Api.Management/OpenApi.json +++ b/src/Umbraco.Cms.Api.Management/OpenApi.json @@ -36738,6 +36738,7 @@ "DocumentItemResponseModel": { "required": [ "documentType", + "hasChildren", "id", "isProtected", "isTrashed", @@ -36755,6 +36756,17 @@ "isProtected": { "type": "boolean" }, + "parent": { + "oneOf": [ + { + "$ref": "#/components/schemas/ReferenceByIdModel" + } + ], + "nullable": true + }, + "hasChildren": { + "type": "boolean" + }, "documentType": { "oneOf": [ { @@ -38895,6 +38907,7 @@ }, "MediaItemResponseModel": { "required": [ + "hasChildren", "id", "isTrashed", "mediaType", @@ -38909,6 +38922,17 @@ "isTrashed": { "type": "boolean" }, + "parent": { + "oneOf": [ + { + "$ref": "#/components/schemas/ReferenceByIdModel" + } + ], + "nullable": true + }, + "hasChildren": { + "type": "boolean" + }, "mediaType": { "oneOf": [ { diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Document/Item/DocumentItemResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Document/Item/DocumentItemResponseModel.cs index 6dc8aa4d59..ad7d991a00 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Document/Item/DocumentItemResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Document/Item/DocumentItemResponseModel.cs @@ -10,6 +10,10 @@ public class DocumentItemResponseModel : ItemResponseModelBase public bool IsProtected { get; set; } + public ReferenceByIdModel? Parent { get; set; } + + public bool HasChildren { get; set; } + public DocumentTypeReferenceResponseModel DocumentType { get; set; } = new(); public IEnumerable Variants { get; set; } = Enumerable.Empty(); diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Media/Item/MediaItemResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Media/Item/MediaItemResponseModel.cs index 2eb4270600..d342a163b8 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Media/Item/MediaItemResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Media/Item/MediaItemResponseModel.cs @@ -8,6 +8,10 @@ public class MediaItemResponseModel : ItemResponseModelBase { public bool IsTrashed { get; set; } + public ReferenceByIdModel? Parent { get; set; } + + public bool HasChildren { get; set; } + public MediaTypeReferenceResponseModel MediaType { get; set; } = new(); public IEnumerable Variants { get; set; } = Enumerable.Empty();