Add variancy information to reference response model (#18645)

* Made variant info available on DocumentReferenceResponseModel

* Fix scope issue

* PR Feedback + correct scoping
This commit is contained in:
Sven Geusens
2025-03-24 12:10:30 +01:00
committed by GitHub
parent 30633fe728
commit 39cad5b2ea
4 changed files with 81 additions and 13 deletions

View File

@@ -1,7 +1,12 @@
using Umbraco.Cms.Api.Management.ViewModels.TrackedReferences;
using Microsoft.Extensions.DependencyInjection;
using Umbraco.Cms.Api.Management.ViewModels.TrackedReferences;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.DependencyInjection;
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.Entities;
using Umbraco.Cms.Core.Persistence.Repositories;
using Umbraco.Cms.Infrastructure.Scoping;
using Umbraco.Extensions;
namespace Umbraco.Cms.Api.Management.Factories;
@@ -9,21 +14,69 @@ namespace Umbraco.Cms.Api.Management.Factories;
public class RelationTypePresentationFactory : IRelationTypePresentationFactory
{
private readonly IUmbracoMapper _umbracoMapper;
private readonly IEntityRepository _entityRepository;
private readonly IDocumentPresentationFactory _documentPresentationFactory;
private readonly IScopeProvider _scopeProvider;
[Obsolete("Please use the non obsoleted constructor. Scheduled for removal in v17")]
public RelationTypePresentationFactory(IUmbracoMapper umbracoMapper)
: this(
umbracoMapper,
StaticServiceProvider.Instance.GetRequiredService<IEntityRepository>(),
StaticServiceProvider.Instance.GetRequiredService<IDocumentPresentationFactory>(),
StaticServiceProvider.Instance.GetRequiredService<IScopeProvider>())
{
_umbracoMapper = umbracoMapper;
}
public async Task<IEnumerable<IReferenceResponseModel>> CreateReferenceResponseModelsAsync(IEnumerable<RelationItemModel> relationItemModels)
public RelationTypePresentationFactory(
IUmbracoMapper umbracoMapper,
IEntityRepository entityRepository,
IDocumentPresentationFactory documentPresentationFactory,
IScopeProvider scopeProvider)
{
IReferenceResponseModel[] result = relationItemModels.Select(relationItemModel => relationItemModel.NodeType switch
_umbracoMapper = umbracoMapper;
_entityRepository = entityRepository;
_documentPresentationFactory = documentPresentationFactory;
_scopeProvider = scopeProvider;
}
public async Task<IEnumerable<IReferenceResponseModel>> CreateReferenceResponseModelsAsync(
IEnumerable<RelationItemModel> relationItemModels)
{
Constants.UdiEntityType.Document => _umbracoMapper.Map<DocumentReferenceResponseModel>(relationItemModel),
IReadOnlyCollection<RelationItemModel> relationItemModelsCollection = relationItemModels.ToArray();
Guid[] documentKeys = relationItemModelsCollection
.Where(item => item.NodeType is Constants.UdiEntityType.Document)
.Select(item => item.NodeKey).Distinct().ToArray();
using IScope scope = _scopeProvider.CreateScope(autoComplete: true);
var slimEntities = _entityRepository.GetAll(Constants.ObjectTypes.Document, documentKeys).ToList();
IReferenceResponseModel[] result = relationItemModelsCollection.Select(relationItemModel =>
relationItemModel.NodeType switch
{
Constants.UdiEntityType.Document => MapDocumentReference(relationItemModel, slimEntities),
Constants.UdiEntityType.Media => _umbracoMapper.Map<MediaReferenceResponseModel>(relationItemModel),
_ => _umbracoMapper.Map<DefaultReferenceResponseModel>(relationItemModel) as IReferenceResponseModel,
_ => _umbracoMapper.Map<DefaultReferenceResponseModel>(relationItemModel),
}).WhereNotNull().ToArray();
return await Task.FromResult(result);
}
private IReferenceResponseModel? MapDocumentReference(RelationItemModel relationItemModel,
List<IEntitySlim> slimEntities)
{
DocumentReferenceResponseModel? documentReferenceResponseModel =
_umbracoMapper.Map<DocumentReferenceResponseModel>(relationItemModel);
if (documentReferenceResponseModel is not null
&& slimEntities.FirstOrDefault(e => e.Key == relationItemModel.NodeKey) is DocumentEntitySlim
matchingSlimDocument)
{
documentReferenceResponseModel.Variants =
_documentPresentationFactory.CreateVariantsItemResponseModels(matchingSlimDocument);
}
return documentReferenceResponseModel;
}
}

View File

@@ -16,7 +16,7 @@ public class TrackedReferenceViewModelsMapDefinition : IMapDefinition
mapper.Define<Guid, ReferenceByIdModel>((source, context) => new ReferenceByIdModel(), Map);
}
// Umbraco.Code.MapAll
// Umbraco.Code.MapAll -Variants
private void Map(RelationItemModel source, DocumentReferenceResponseModel target, MapperContext context)
{
target.Id = source.NodeKey;

View File

@@ -37126,7 +37126,8 @@
"required": [
"$type",
"documentType",
"id"
"id",
"variants"
],
"type": "object",
"properties": {
@@ -37151,6 +37152,16 @@
"$ref": "#/components/schemas/TrackedReferenceDocumentTypeModel"
}
]
},
"variants": {
"type": "array",
"items": {
"oneOf": [
{
"$ref": "#/components/schemas/DocumentVariantItemResponseModel"
}
]
}
}
},
"additionalProperties": false,

View File

@@ -1,4 +1,6 @@
namespace Umbraco.Cms.Api.Management.ViewModels.TrackedReferences;
using Umbraco.Cms.Api.Management.ViewModels.Document;
namespace Umbraco.Cms.Api.Management.ViewModels.TrackedReferences;
public class DocumentReferenceResponseModel : IReferenceResponseModel
{
@@ -9,4 +11,6 @@ public class DocumentReferenceResponseModel : IReferenceResponseModel
public bool? Published { get; set; }
public TrackedReferenceDocumentType DocumentType { get; set; } = new();
public IEnumerable<DocumentVariantItemResponseModel> Variants { get; set; } = Enumerable.Empty<DocumentVariantItemResponseModel>();
}