Merge remote-tracking branch 'origin/v14/dev' into v14/dev

This commit is contained in:
Bjarke Berg
2024-02-01 12:09:57 +01:00
27 changed files with 173 additions and 191 deletions

View File

@@ -19,7 +19,7 @@
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.1" /> <PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.1" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.1" /> <PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.1" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.1" /> <PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="8.0.1" /> <PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" /> <PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" /> <PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" /> <PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />

View File

@@ -1,10 +1,8 @@
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.Content; using Umbraco.Cms.Api.Management.ViewModels.Content;
using Umbraco.Cms.Api.Management.ViewModels.Document;
using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Models.ContentEditing;
using Umbraco.Cms.Core.Models.ContentEditing.Validation; using Umbraco.Cms.Core.Models.ContentEditing.Validation;
using Umbraco.Cms.Core.Models.ContentPublishing;
using Umbraco.Cms.Core.Services.OperationStatus; using Umbraco.Cms.Core.Services.OperationStatus;
using Umbraco.Extensions; using Umbraco.Extensions;
@@ -63,7 +61,8 @@ public class ContentControllerBase : ManagementApiControllerBase
.WithTitle("Invalid sorting options") .WithTitle("Invalid sorting options")
.WithDetail("The supplied sorting operations were invalid. Additional details can be found in the log.") .WithDetail("The supplied sorting operations were invalid. Additional details can be found in the log.")
.Build()), .Build()),
ContentEditingOperationStatus.Unknown => StatusCode(StatusCodes.Status500InternalServerError, ContentEditingOperationStatus.Unknown => StatusCode(
StatusCodes.Status500InternalServerError,
problemDetailsBuilder problemDetailsBuilder
.WithTitle("Unknown error. Please see the log for more details.") .WithTitle("Unknown error. Please see the log for more details.")
.Build()), .Build()),
@@ -112,125 +111,4 @@ public class ContentControllerBase : ManagementApiControllerBase
.WithExtension("missingProperties", missingPropertyAliases.ToArray()) .WithExtension("missingProperties", missingPropertyAliases.ToArray())
.Build())); .Build()));
} }
protected IActionResult ContentPublishingOperationStatusResult(
ContentPublishingOperationStatus status,
IEnumerable<string>? invalidPropertyAliases = null,
IEnumerable<ContentPublishingBranchItemResult>? failedBranchItems = null)
=> OperationStatusResult(status, problemDetailsBuilder => status switch
{
ContentPublishingOperationStatus.ContentNotFound => NotFound(problemDetailsBuilder
.WithTitle("The requested content could not be found")
.Build()),
ContentPublishingOperationStatus.CancelledByEvent => BadRequest(problemDetailsBuilder
.WithTitle("Publish cancelled by event")
.WithDetail("The publish operation was cancelled by an event.")
.Build()),
ContentPublishingOperationStatus.ContentInvalid => BadRequest(problemDetailsBuilder
.WithTitle("Invalid content")
.WithDetail("The specified content had an invalid configuration.")
.WithExtension("invalidProperties", invalidPropertyAliases ?? Enumerable.Empty<string>())
.Build()),
ContentPublishingOperationStatus.NothingToPublish => BadRequest(problemDetailsBuilder
.WithTitle("Nothing to publish")
.WithDetail("None of the specified cultures needed publishing.")
.Build()),
ContentPublishingOperationStatus.MandatoryCultureMissing => BadRequest(problemDetailsBuilder
.WithTitle("Mandatory culture missing")
.WithDetail("Must include all mandatory cultures when publishing.")
.Build()),
ContentPublishingOperationStatus.HasExpired => BadRequest(problemDetailsBuilder
.WithTitle("Content expired")
.WithDetail("Could not publish the content because it was expired.")
.Build()),
ContentPublishingOperationStatus.CultureHasExpired => BadRequest(problemDetailsBuilder
.WithTitle("Content culture expired")
.WithDetail("Could not publish the content because some of the specified cultures were expired.")
.Build()),
ContentPublishingOperationStatus.AwaitingRelease => BadRequest(problemDetailsBuilder
.WithTitle("Content awaiting release")
.WithDetail("Could not publish the content because it was awaiting release.")
.Build()),
ContentPublishingOperationStatus.CultureAwaitingRelease => BadRequest(problemDetailsBuilder
.WithTitle("Content culture awaiting release")
.WithDetail(
"Could not publish the content because some of the specified cultures were awaiting release.")
.Build()),
ContentPublishingOperationStatus.InTrash => BadRequest(problemDetailsBuilder
.WithTitle("Content in the recycle bin")
.WithDetail("Could not publish the content because it was in the recycle bin.")
.Build()),
ContentPublishingOperationStatus.PathNotPublished => BadRequest(problemDetailsBuilder
.WithTitle("Parent not published")
.WithDetail("Could not publish the content because its parent was not published.")
.Build()),
ContentPublishingOperationStatus.ConcurrencyViolation => BadRequest(problemDetailsBuilder
.WithTitle("Concurrency violation detected")
.WithDetail("An attempt was made to publish a version older than the latest version.")
.Build()),
ContentPublishingOperationStatus.UnsavedChanges => BadRequest(problemDetailsBuilder
.WithTitle("Unsaved changes")
.WithDetail(
"Could not publish the content because it had unsaved changes. Make sure to save all changes before attempting a publish.")
.Build()),
ContentPublishingOperationStatus.FailedBranch => BadRequest(problemDetailsBuilder
.WithTitle("Failed branch operation")
.WithDetail("One or more items in the branch could not complete the operation.")
.WithExtension("failedBranchItems", failedBranchItems?.Select(item => new DocumentPublishBranchItemResult
{
Id = item.Key,
OperationStatus = item.OperationStatus
}) ?? Enumerable.Empty<DocumentPublishBranchItemResult>())
.Build()),
ContentPublishingOperationStatus.Failed => BadRequest(problemDetailsBuilder
.WithTitle("Publish or unpublish failed")
.WithDetail(
"An unspecified error occurred while (un)publishing. Please check the logs for additional information.")
.Build()),
_ => StatusCode(StatusCodes.Status500InternalServerError, "Unknown content operation status."),
});
protected IActionResult ContentCreatingOperationStatusResult(ContentCreatingOperationStatus status)
=> OperationStatusResult(status, problemDetailsBuilder => status switch
{
ContentCreatingOperationStatus.NotFound => NotFound(problemDetailsBuilder
.WithTitle("The content type could not be found")
.Build()),
_ => StatusCode(StatusCodes.Status500InternalServerError, problemDetailsBuilder
.WithTitle("Unknown content operation status.")
.Build()),
});
protected IActionResult PublicAccessOperationStatusResult(PublicAccessOperationStatus status)
=> OperationStatusResult(status, problemDetailsBuilder => status switch
{
PublicAccessOperationStatus.ContentNotFound => NotFound(problemDetailsBuilder
.WithTitle("The content could not be found")
.Build()),
PublicAccessOperationStatus.ErrorNodeNotFound => NotFound(problemDetailsBuilder
.WithTitle("The error page could not be found")
.Build()),
PublicAccessOperationStatus.LoginNodeNotFound => NotFound(problemDetailsBuilder
.WithTitle("The login page could not be found")
.Build()),
PublicAccessOperationStatus.NoAllowedEntities => BadRequest(problemDetailsBuilder
.WithTitle("No allowed entities given")
.WithDetail("Both MemberGroups and Members were empty, thus no entities can be allowed.")
.Build()),
PublicAccessOperationStatus.CancelledByNotification => BadRequest(problemDetailsBuilder
.WithTitle("Request cancelled by notification")
.WithDetail("The request to save a public access entry was cancelled by a notification handler.")
.Build()),
PublicAccessOperationStatus.AmbiguousRule => BadRequest(problemDetailsBuilder
.WithTitle("Ambiguous Rule")
.WithDetail("The specified rule is ambiguous, because both member groups and member names were given.")
.Build()),
PublicAccessOperationStatus.EntryNotFound => BadRequest(problemDetailsBuilder
.WithTitle("Entry not found")
.WithDetail("The specified entry was not found.")
.Build()),
_ => StatusCode(StatusCodes.Status500InternalServerError, problemDetailsBuilder
.WithTitle("Unknown content operation status.")
.Build()),
});
} }

View File

@@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.Controllers.Content; using Umbraco.Cms.Api.Management.Controllers.Content;
using Umbraco.Cms.Api.Management.Routing; using Umbraco.Cms.Api.Management.Routing;
@@ -6,6 +7,7 @@ using Umbraco.Cms.Api.Management.ViewModels.Content;
using Umbraco.Cms.Api.Management.ViewModels.Document; using Umbraco.Cms.Api.Management.ViewModels.Document;
using Umbraco.Cms.Core; using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Models.ContentEditing;
using Umbraco.Cms.Core.Models.ContentPublishing;
using Umbraco.Cms.Core.Services.OperationStatus; using Umbraco.Cms.Core.Services.OperationStatus;
using Umbraco.Cms.Web.Common.Authorization; using Umbraco.Cms.Web.Common.Authorization;
@@ -20,7 +22,7 @@ public abstract class DocumentControllerBase : ContentControllerBase
protected IActionResult DocumentNotFound() protected IActionResult DocumentNotFound()
=> OperationStatusResult(ContentEditingOperationStatus.NotFound, problemDetailsBuilder => OperationStatusResult(ContentEditingOperationStatus.NotFound, problemDetailsBuilder
=> NotFound(problemDetailsBuilder => NotFound(problemDetailsBuilder
.WithTitle("The requested Document could not be found") .WithTitle("The document could not be found")
.Build())); .Build()));
protected IActionResult DocumentEditingOperationStatusResult<TContentModelBase>( protected IActionResult DocumentEditingOperationStatusResult<TContentModelBase>(
@@ -29,4 +31,114 @@ public abstract class DocumentControllerBase : ContentControllerBase
ContentValidationResult validationResult) ContentValidationResult validationResult)
where TContentModelBase : ContentModelBase<DocumentValueModel, DocumentVariantRequestModel> where TContentModelBase : ContentModelBase<DocumentValueModel, DocumentVariantRequestModel>
=> ContentEditingOperationStatusResult<TContentModelBase, DocumentValueModel, DocumentVariantRequestModel>(status, requestModel, validationResult); => ContentEditingOperationStatusResult<TContentModelBase, DocumentValueModel, DocumentVariantRequestModel>(status, requestModel, validationResult);
protected IActionResult DocumentPublishingOperationStatusResult(
ContentPublishingOperationStatus status,
IEnumerable<string>? invalidPropertyAliases = null,
IEnumerable<ContentPublishingBranchItemResult>? failedBranchItems = null)
=> OperationStatusResult(status, problemDetailsBuilder => status switch
{
ContentPublishingOperationStatus.ContentNotFound => NotFound(problemDetailsBuilder
.WithTitle("The requested document could not be found")
.Build()),
ContentPublishingOperationStatus.CancelledByEvent => BadRequest(problemDetailsBuilder
.WithTitle("Publish cancelled by event")
.WithDetail("The publish operation was cancelled by an event.")
.Build()),
ContentPublishingOperationStatus.ContentInvalid => BadRequest(problemDetailsBuilder
.WithTitle("Invalid document")
.WithDetail("The specified document had an invalid configuration.")
.WithExtension("invalidProperties", invalidPropertyAliases ?? Enumerable.Empty<string>())
.Build()),
ContentPublishingOperationStatus.NothingToPublish => BadRequest(problemDetailsBuilder
.WithTitle("Nothing to publish")
.WithDetail("None of the specified cultures needed publishing.")
.Build()),
ContentPublishingOperationStatus.MandatoryCultureMissing => BadRequest(problemDetailsBuilder
.WithTitle("Mandatory culture missing")
.WithDetail("Must include all mandatory cultures when publishing.")
.Build()),
ContentPublishingOperationStatus.HasExpired => BadRequest(problemDetailsBuilder
.WithTitle("Document expired")
.WithDetail("Could not publish the document because it was expired.")
.Build()),
ContentPublishingOperationStatus.CultureHasExpired => BadRequest(problemDetailsBuilder
.WithTitle("Document culture expired")
.WithDetail("Could not publish the document because some of the specified cultures were expired.")
.Build()),
ContentPublishingOperationStatus.AwaitingRelease => BadRequest(problemDetailsBuilder
.WithTitle("Document awaiting release")
.WithDetail("Could not publish the document because it was awaiting release.")
.Build()),
ContentPublishingOperationStatus.CultureAwaitingRelease => BadRequest(problemDetailsBuilder
.WithTitle("Document culture awaiting release")
.WithDetail(
"Could not publish the document because some of the specified cultures were awaiting release.")
.Build()),
ContentPublishingOperationStatus.InTrash => BadRequest(problemDetailsBuilder
.WithTitle("Document in the recycle bin")
.WithDetail("Could not publish the document because it was in the recycle bin.")
.Build()),
ContentPublishingOperationStatus.PathNotPublished => BadRequest(problemDetailsBuilder
.WithTitle("Parent not published")
.WithDetail("Could not publish the document because its parent was not published.")
.Build()),
ContentPublishingOperationStatus.ConcurrencyViolation => BadRequest(problemDetailsBuilder
.WithTitle("Concurrency violation detected")
.WithDetail("An attempt was made to publish a version older than the latest version.")
.Build()),
ContentPublishingOperationStatus.UnsavedChanges => BadRequest(problemDetailsBuilder
.WithTitle("Unsaved changes")
.WithDetail(
"Could not publish the document because it had unsaved changes. Make sure to save all changes before attempting a publish.")
.Build()),
ContentPublishingOperationStatus.FailedBranch => BadRequest(problemDetailsBuilder
.WithTitle("Failed branch operation")
.WithDetail("One or more items in the branch could not complete the operation.")
.WithExtension("failedBranchItems", failedBranchItems?.Select(item => new DocumentPublishBranchItemResult
{
Id = item.Key,
OperationStatus = item.OperationStatus
}) ?? Enumerable.Empty<DocumentPublishBranchItemResult>())
.Build()),
ContentPublishingOperationStatus.Failed => BadRequest(problemDetailsBuilder
.WithTitle("Publish or unpublish failed")
.WithDetail(
"An unspecified error occurred while (un)publishing. Please check the logs for additional information.")
.Build()),
_ => StatusCode(StatusCodes.Status500InternalServerError, "Unknown content operation status."),
});
protected IActionResult PublicAccessOperationStatusResult(PublicAccessOperationStatus status)
=> OperationStatusResult(status, problemDetailsBuilder => status switch
{
PublicAccessOperationStatus.ContentNotFound => NotFound(problemDetailsBuilder
.WithTitle("The document could not be found")
.Build()),
PublicAccessOperationStatus.ErrorNodeNotFound => NotFound(problemDetailsBuilder
.WithTitle("The error page could not be found")
.Build()),
PublicAccessOperationStatus.LoginNodeNotFound => NotFound(problemDetailsBuilder
.WithTitle("The login page could not be found")
.Build()),
PublicAccessOperationStatus.NoAllowedEntities => BadRequest(problemDetailsBuilder
.WithTitle("No allowed entities given")
.WithDetail("Both MemberGroups and Members were empty, thus no entities can be allowed.")
.Build()),
PublicAccessOperationStatus.CancelledByNotification => BadRequest(problemDetailsBuilder
.WithTitle("Request cancelled by notification")
.WithDetail("The request to save a public access entry was cancelled by a notification handler.")
.Build()),
PublicAccessOperationStatus.AmbiguousRule => BadRequest(problemDetailsBuilder
.WithTitle("Ambiguous Rule")
.WithDetail("The specified rule is ambiguous, because both member groups and member names were given.")
.Build()),
PublicAccessOperationStatus.EntryNotFound => BadRequest(problemDetailsBuilder
.WithTitle("Entry not found")
.WithDetail("The specified entry was not found.")
.Build()),
_ => StatusCode(StatusCodes.Status500InternalServerError, problemDetailsBuilder
.WithTitle("Unknown content operation status.")
.Build()),
});
} }

View File

@@ -56,6 +56,6 @@ public class PublishDocumentController : DocumentControllerBase
CurrentUserKey(_backOfficeSecurityAccessor)); CurrentUserKey(_backOfficeSecurityAccessor));
return attempt.Success return attempt.Success
? Ok() ? Ok()
: ContentPublishingOperationStatusResult(attempt.Status, invalidPropertyAliases: attempt.Result.InvalidPropertyAliases); : DocumentPublishingOperationStatusResult(attempt.Status, invalidPropertyAliases: attempt.Result.InvalidPropertyAliases);
} }
} }

View File

@@ -57,6 +57,6 @@ public class PublishDocumentWithDescendantsController : DocumentControllerBase
return attempt.Success return attempt.Success
? Ok() ? Ok()
: ContentPublishingOperationStatusResult(attempt.Status, failedBranchItems: attempt.Result.FailedItems); : DocumentPublishingOperationStatusResult(attempt.Status, failedBranchItems: attempt.Result.FailedItems);
} }
} }

View File

@@ -58,6 +58,6 @@ public class UnpublishDocumentController : DocumentControllerBase
CurrentUserKey(_backOfficeSecurityAccessor)); CurrentUserKey(_backOfficeSecurityAccessor));
return attempt.Success return attempt.Success
? Ok() ? Ok()
: ContentPublishingOperationStatusResult(attempt.Result); : DocumentPublishingOperationStatusResult(attempt.Result);
} }
} }

View File

@@ -18,16 +18,16 @@ public class ByKeyMediaController : MediaControllerBase
{ {
private readonly IAuthorizationService _authorizationService; private readonly IAuthorizationService _authorizationService;
private readonly IMediaEditingService _mediaEditingService; private readonly IMediaEditingService _mediaEditingService;
private readonly IMediaPresentationModelFactory _mediaPresentationModelFactory; private readonly IMediaPresentationFactory _mediaPresentationFactory;
public ByKeyMediaController( public ByKeyMediaController(
IAuthorizationService authorizationService, IAuthorizationService authorizationService,
IMediaEditingService mediaEditingService, IMediaEditingService mediaEditingService,
IMediaPresentationModelFactory mediaPresentationModelFactory) IMediaPresentationFactory mediaPresentationFactory)
{ {
_authorizationService = authorizationService; _authorizationService = authorizationService;
_mediaEditingService = mediaEditingService; _mediaEditingService = mediaEditingService;
_mediaPresentationModelFactory = mediaPresentationModelFactory; _mediaPresentationFactory = mediaPresentationFactory;
} }
[HttpGet("{id:guid}")] [HttpGet("{id:guid}")]
@@ -52,7 +52,7 @@ public class ByKeyMediaController : MediaControllerBase
return MediaNotFound(); return MediaNotFound();
} }
MediaResponseModel model = await _mediaPresentationModelFactory.CreateResponseModelAsync(media); MediaResponseModel model = await _mediaPresentationFactory.CreateResponseModelAsync(media);
return Ok(model); return Ok(model);
} }
} }

View File

@@ -14,12 +14,12 @@ namespace Umbraco.Cms.Api.Management.Controllers.Media.Item;
public class ItemMediaItemController : MediaItemControllerBase public class ItemMediaItemController : MediaItemControllerBase
{ {
private readonly IEntityService _entityService; private readonly IEntityService _entityService;
private readonly IMediaPresentationModelFactory _mediaPresentationModelFactory; private readonly IMediaPresentationFactory _mediaPresentationFactory;
public ItemMediaItemController(IEntityService entityService, IMediaPresentationModelFactory mediaPresentationModelFactory) public ItemMediaItemController(IEntityService entityService, IMediaPresentationFactory mediaPresentationFactory)
{ {
_entityService = entityService; _entityService = entityService;
_mediaPresentationModelFactory = mediaPresentationModelFactory; _mediaPresentationFactory = mediaPresentationFactory;
} }
[HttpGet("item")] [HttpGet("item")]
@@ -31,7 +31,7 @@ public class ItemMediaItemController : MediaItemControllerBase
.GetAll(UmbracoObjectTypes.Media, ids.ToArray()) .GetAll(UmbracoObjectTypes.Media, ids.ToArray())
.OfType<IMediaEntitySlim>(); .OfType<IMediaEntitySlim>();
IEnumerable<MediaItemResponseModel> responseModels = media.Select(_mediaPresentationModelFactory.CreateItemResponseModel); IEnumerable<MediaItemResponseModel> responseModels = media.Select(_mediaPresentationFactory.CreateItemResponseModel);
return await Task.FromResult(Ok(responseModels)); return await Task.FromResult(Ok(responseModels));
} }
} }

View File

@@ -11,8 +11,8 @@ namespace Umbraco.Cms.Api.Management.Controllers.Media.RecycleBin;
[ApiVersion("1.0")] [ApiVersion("1.0")]
public class ChildrenMediaRecycleBinController : MediaRecycleBinControllerBase public class ChildrenMediaRecycleBinController : MediaRecycleBinControllerBase
{ {
public ChildrenMediaRecycleBinController(IEntityService entityService, IMediaPresentationModelFactory mediaPresentationModelFactory) public ChildrenMediaRecycleBinController(IEntityService entityService, IMediaPresentationFactory mediaPresentationFactory)
: base(entityService, mediaPresentationModelFactory) : base(entityService, mediaPresentationFactory)
{ {
} }

View File

@@ -24,8 +24,8 @@ public class EmptyMediaRecycleBinController : MediaRecycleBinControllerBase
IAuthorizationService authorizationService, IAuthorizationService authorizationService,
IBackOfficeSecurityAccessor backOfficeSecurityAccessor, IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
IMediaService mediaService, IMediaService mediaService,
IMediaPresentationModelFactory mediaPresentationModelFactory) IMediaPresentationFactory mediaPresentationFactory)
: base(entityService, mediaPresentationModelFactory) : base(entityService, mediaPresentationFactory)
{ {
_authorizationService = authorizationService; _authorizationService = authorizationService;
_backOfficeSecurityAccessor = backOfficeSecurityAccessor; _backOfficeSecurityAccessor = backOfficeSecurityAccessor;

View File

@@ -22,11 +22,11 @@ namespace Umbraco.Cms.Api.Management.Controllers.Media.RecycleBin;
[Authorize(Policy = "New" + AuthorizationPolicies.SectionAccessMedia)] [Authorize(Policy = "New" + AuthorizationPolicies.SectionAccessMedia)]
public class MediaRecycleBinControllerBase : RecycleBinControllerBase<MediaRecycleBinItemResponseModel> public class MediaRecycleBinControllerBase : RecycleBinControllerBase<MediaRecycleBinItemResponseModel>
{ {
private readonly IMediaPresentationModelFactory _mediaPresentationModelFactory; private readonly IMediaPresentationFactory _mediaPresentationFactory;
public MediaRecycleBinControllerBase(IEntityService entityService, IMediaPresentationModelFactory mediaPresentationModelFactory) public MediaRecycleBinControllerBase(IEntityService entityService, IMediaPresentationFactory mediaPresentationFactory)
: base(entityService) : base(entityService)
=> _mediaPresentationModelFactory = mediaPresentationModelFactory; => _mediaPresentationFactory = mediaPresentationFactory;
protected override UmbracoObjectTypes ItemObjectType => UmbracoObjectTypes.Media; protected override UmbracoObjectTypes ItemObjectType => UmbracoObjectTypes.Media;
@@ -38,8 +38,8 @@ public class MediaRecycleBinControllerBase : RecycleBinControllerBase<MediaRecyc
if (entity is IMediaEntitySlim mediaEntitySlim) if (entity is IMediaEntitySlim mediaEntitySlim)
{ {
responseModel.Variants = _mediaPresentationModelFactory.CreateVariantsItemResponseModels(mediaEntitySlim); responseModel.Variants = _mediaPresentationFactory.CreateVariantsItemResponseModels(mediaEntitySlim);
responseModel.MediaType = _mediaPresentationModelFactory.CreateMediaTypeReferenceResponseModel(mediaEntitySlim); responseModel.MediaType = _mediaPresentationFactory.CreateMediaTypeReferenceResponseModel(mediaEntitySlim);
} }
return responseModel; return responseModel;

View File

@@ -11,8 +11,8 @@ namespace Umbraco.Cms.Api.Management.Controllers.Media.RecycleBin;
[ApiVersion("1.0")] [ApiVersion("1.0")]
public class RootMediaRecycleBinController : MediaRecycleBinControllerBase public class RootMediaRecycleBinController : MediaRecycleBinControllerBase
{ {
public RootMediaRecycleBinController(IEntityService entityService, IMediaPresentationModelFactory mediaPresentationModelFactory) public RootMediaRecycleBinController(IEntityService entityService, IMediaPresentationFactory mediaPresentationFactory)
: base(entityService, mediaPresentationModelFactory) : base(entityService, mediaPresentationFactory)
{ {
} }

View File

@@ -20,8 +20,8 @@ public class ChildrenMediaTreeController : MediaTreeControllerBase
IDataTypeService dataTypeService, IDataTypeService dataTypeService,
AppCaches appCaches, AppCaches appCaches,
IBackOfficeSecurityAccessor backofficeSecurityAccessor, IBackOfficeSecurityAccessor backofficeSecurityAccessor,
IMediaPresentationModelFactory mediaPresentationModelFactory) IMediaPresentationFactory mediaPresentationFactory)
: base(entityService, userStartNodeEntitiesService, dataTypeService, appCaches, backofficeSecurityAccessor, mediaPresentationModelFactory) : base(entityService, userStartNodeEntitiesService, dataTypeService, appCaches, backofficeSecurityAccessor, mediaPresentationFactory)
{ {
} }

View File

@@ -23,7 +23,7 @@ public class MediaTreeControllerBase : UserStartNodeTreeControllerBase<MediaTree
{ {
private readonly AppCaches _appCaches; private readonly AppCaches _appCaches;
private readonly IBackOfficeSecurityAccessor _backofficeSecurityAccessor; private readonly IBackOfficeSecurityAccessor _backofficeSecurityAccessor;
private readonly IMediaPresentationModelFactory _mediaPresentationModelFactory; private readonly IMediaPresentationFactory _mediaPresentationFactory;
public MediaTreeControllerBase( public MediaTreeControllerBase(
IEntityService entityService, IEntityService entityService,
@@ -31,12 +31,12 @@ public class MediaTreeControllerBase : UserStartNodeTreeControllerBase<MediaTree
IDataTypeService dataTypeService, IDataTypeService dataTypeService,
AppCaches appCaches, AppCaches appCaches,
IBackOfficeSecurityAccessor backofficeSecurityAccessor, IBackOfficeSecurityAccessor backofficeSecurityAccessor,
IMediaPresentationModelFactory mediaPresentationModelFactory) IMediaPresentationFactory mediaPresentationFactory)
: base(entityService, userStartNodeEntitiesService, dataTypeService) : base(entityService, userStartNodeEntitiesService, dataTypeService)
{ {
_appCaches = appCaches; _appCaches = appCaches;
_backofficeSecurityAccessor = backofficeSecurityAccessor; _backofficeSecurityAccessor = backofficeSecurityAccessor;
_mediaPresentationModelFactory = mediaPresentationModelFactory; _mediaPresentationFactory = mediaPresentationFactory;
} }
protected override UmbracoObjectTypes ItemObjectType => UmbracoObjectTypes.Media; protected override UmbracoObjectTypes ItemObjectType => UmbracoObjectTypes.Media;
@@ -52,8 +52,8 @@ public class MediaTreeControllerBase : UserStartNodeTreeControllerBase<MediaTree
responseModel.IsTrashed = entity.Trashed; responseModel.IsTrashed = entity.Trashed;
responseModel.Id = entity.Key; responseModel.Id = entity.Key;
responseModel.Variants = _mediaPresentationModelFactory.CreateVariantsItemResponseModels(mediaEntitySlim); responseModel.Variants = _mediaPresentationFactory.CreateVariantsItemResponseModels(mediaEntitySlim);
responseModel.MediaType = _mediaPresentationModelFactory.CreateMediaTypeReferenceResponseModel(mediaEntitySlim); responseModel.MediaType = _mediaPresentationFactory.CreateMediaTypeReferenceResponseModel(mediaEntitySlim);
} }
return responseModel; return responseModel;

View File

@@ -20,8 +20,8 @@ public class RootMediaTreeController : MediaTreeControllerBase
IDataTypeService dataTypeService, IDataTypeService dataTypeService,
AppCaches appCaches, AppCaches appCaches,
IBackOfficeSecurityAccessor backofficeSecurityAccessor, IBackOfficeSecurityAccessor backofficeSecurityAccessor,
IMediaPresentationModelFactory mediaPresentationModelFactory) IMediaPresentationFactory mediaPresentationFactory)
: base(entityService, userStartNodeEntitiesService, dataTypeService, appCaches, backofficeSecurityAccessor, mediaPresentationModelFactory) : base(entityService, userStartNodeEntitiesService, dataTypeService, appCaches, backofficeSecurityAccessor, mediaPresentationFactory)
{ {
} }

View File

@@ -10,10 +10,10 @@ namespace Umbraco.Cms.Api.Management.Controllers.PartialView.Item;
[ApiVersion("1.0")] [ApiVersion("1.0")]
public class ItemPartialViewItemController : PartialViewItemControllerBase public class ItemPartialViewItemController : PartialViewItemControllerBase
{ {
private readonly IFileItemPresentationModelFactory _fileItemPresentationModelFactory; private readonly IFileItemPresentationFactory _fileItemPresentationFactory;
public ItemPartialViewItemController(IFileItemPresentationModelFactory fileItemPresentationModelFactory) public ItemPartialViewItemController(IFileItemPresentationFactory fileItemPresentationFactory)
=> _fileItemPresentationModelFactory = fileItemPresentationModelFactory; => _fileItemPresentationFactory = fileItemPresentationFactory;
[HttpGet("item")] [HttpGet("item")]
[MapToApiVersion("1.0")] [MapToApiVersion("1.0")]
@@ -21,7 +21,7 @@ public class ItemPartialViewItemController : PartialViewItemControllerBase
public async Task<IActionResult> Item([FromQuery(Name = "path")] HashSet<string> paths) public async Task<IActionResult> Item([FromQuery(Name = "path")] HashSet<string> paths)
{ {
paths = paths.Select(path => path.VirtualPathToSystemPath()).ToHashSet(); paths = paths.Select(path => path.VirtualPathToSystemPath()).ToHashSet();
IEnumerable<PartialViewItemResponseModel> responseModels = _fileItemPresentationModelFactory.CreatePartialViewItemResponseModels(paths); IEnumerable<PartialViewItemResponseModel> responseModels = _fileItemPresentationFactory.CreatePartialViewItemResponseModels(paths);
return await Task.FromResult(Ok(responseModels)); return await Task.FromResult(Ok(responseModels));
} }
} }

View File

@@ -10,10 +10,10 @@ namespace Umbraco.Cms.Api.Management.Controllers.Script.Item;
[ApiVersion("1.0")] [ApiVersion("1.0")]
public class ItemScriptItemController : ScriptItemControllerBase public class ItemScriptItemController : ScriptItemControllerBase
{ {
private readonly IFileItemPresentationModelFactory _fileItemPresentationModelFactory; private readonly IFileItemPresentationFactory _fileItemPresentationFactory;
public ItemScriptItemController(IFileItemPresentationModelFactory fileItemPresentationModelFactory) public ItemScriptItemController(IFileItemPresentationFactory fileItemPresentationFactory)
=> _fileItemPresentationModelFactory = fileItemPresentationModelFactory; => _fileItemPresentationFactory = fileItemPresentationFactory;
[HttpGet("item")] [HttpGet("item")]
[MapToApiVersion("1.0")] [MapToApiVersion("1.0")]
@@ -21,7 +21,7 @@ public class ItemScriptItemController : ScriptItemControllerBase
public async Task<IActionResult> Item([FromQuery(Name = "path")] HashSet<string> paths) public async Task<IActionResult> Item([FromQuery(Name = "path")] HashSet<string> paths)
{ {
paths = paths.Select(path => path.VirtualPathToSystemPath()).ToHashSet(); paths = paths.Select(path => path.VirtualPathToSystemPath()).ToHashSet();
IEnumerable<ScriptItemResponseModel> responseModels = _fileItemPresentationModelFactory.CreateScriptItemResponseModels(paths); IEnumerable<ScriptItemResponseModel> responseModels = _fileItemPresentationFactory.CreateScriptItemResponseModels(paths);
return await Task.FromResult(Ok(responseModels)); return await Task.FromResult(Ok(responseModels));
} }
} }

View File

@@ -10,10 +10,10 @@ namespace Umbraco.Cms.Api.Management.Controllers.StaticFile.Item;
[ApiVersion("1.0")] [ApiVersion("1.0")]
public class ItemStaticFileItemController : StaticFileItemControllerBase public class ItemStaticFileItemController : StaticFileItemControllerBase
{ {
private readonly IFileItemPresentationModelFactory _fileItemPresentationModelFactory; private readonly IFileItemPresentationFactory _fileItemPresentationFactory;
public ItemStaticFileItemController(IFileItemPresentationModelFactory fileItemPresentationModelFactory) public ItemStaticFileItemController(IFileItemPresentationFactory fileItemPresentationFactory)
=> _fileItemPresentationModelFactory = fileItemPresentationModelFactory; => _fileItemPresentationFactory = fileItemPresentationFactory;
[HttpGet("item")] [HttpGet("item")]
[MapToApiVersion("1.0")] [MapToApiVersion("1.0")]
@@ -21,7 +21,7 @@ public class ItemStaticFileItemController : StaticFileItemControllerBase
public async Task<IActionResult> Item([FromQuery(Name = "path")] HashSet<string> paths) public async Task<IActionResult> Item([FromQuery(Name = "path")] HashSet<string> paths)
{ {
paths = paths.Select(path => path.VirtualPathToSystemPath()).ToHashSet(); paths = paths.Select(path => path.VirtualPathToSystemPath()).ToHashSet();
IEnumerable<StaticFileItemResponseModel> responseModels = _fileItemPresentationModelFactory.CreateStaticFileItemResponseModels(paths); IEnumerable<StaticFileItemResponseModel> responseModels = _fileItemPresentationFactory.CreateStaticFileItemResponseModels(paths);
return await Task.FromResult(Ok(responseModels)); return await Task.FromResult(Ok(responseModels));
} }
} }

View File

@@ -10,10 +10,10 @@ namespace Umbraco.Cms.Api.Management.Controllers.Stylesheet.Item;
[ApiVersion("1.0")] [ApiVersion("1.0")]
public class ItemStylesheetItemController : StylesheetItemControllerBase public class ItemStylesheetItemController : StylesheetItemControllerBase
{ {
private readonly IFileItemPresentationModelFactory _fileItemPresentationModelFactory; private readonly IFileItemPresentationFactory _fileItemPresentationFactory;
public ItemStylesheetItemController(IFileItemPresentationModelFactory fileItemPresentationModelFactory) public ItemStylesheetItemController(IFileItemPresentationFactory fileItemPresentationFactory)
=> _fileItemPresentationModelFactory = fileItemPresentationModelFactory; => _fileItemPresentationFactory = fileItemPresentationFactory;
[HttpGet("item")] [HttpGet("item")]
[MapToApiVersion("1.0")] [MapToApiVersion("1.0")]
@@ -21,7 +21,7 @@ public class ItemStylesheetItemController : StylesheetItemControllerBase
public async Task<IActionResult> Item([FromQuery(Name = "path")] HashSet<string> paths) public async Task<IActionResult> Item([FromQuery(Name = "path")] HashSet<string> paths)
{ {
paths = paths.Select(path => path.VirtualPathToSystemPath()).ToHashSet(); paths = paths.Select(path => path.VirtualPathToSystemPath()).ToHashSet();
IEnumerable<StylesheetItemResponseModel> responseModels = _fileItemPresentationModelFactory.CreateStylesheetItemResponseModels(paths); IEnumerable<StylesheetItemResponseModel> responseModels = _fileItemPresentationFactory.CreateStylesheetItemResponseModels(paths);
return await Task.FromResult(Ok(responseModels)); return await Task.FromResult(Ok(responseModels));
} }
} }

View File

@@ -12,7 +12,7 @@ internal static class EntityBuilderExtensions
{ {
builder.WithCollectionBuilder<MapDefinitionCollectionBuilder>() builder.WithCollectionBuilder<MapDefinitionCollectionBuilder>()
.Add<ItemTypeMapDefinition>(); .Add<ItemTypeMapDefinition>();
builder.Services.AddUnique<IFileItemPresentationModelFactory, FileItemPresentationModelFactory>(); builder.Services.AddUnique<IFileItemPresentationFactory, FileItemPresentationFactory>();
return builder; return builder;
} }

View File

@@ -12,7 +12,7 @@ internal static class MediaBuilderExtensions
{ {
internal static IUmbracoBuilder AddMedia(this IUmbracoBuilder builder) internal static IUmbracoBuilder AddMedia(this IUmbracoBuilder builder)
{ {
builder.Services.AddTransient<IMediaPresentationModelFactory, MediaPresentationModelFactory>(); builder.Services.AddTransient<IMediaPresentationFactory, MediaPresentationFactory>();
builder.Services.AddTransient<IMediaEditingPresentationFactory, MediaEditingPresentationFactory>(); builder.Services.AddTransient<IMediaEditingPresentationFactory, MediaEditingPresentationFactory>();
builder.Services.AddTransient<IUrlAssembler, DefaultUrlAssembler>(); builder.Services.AddTransient<IUrlAssembler, DefaultUrlAssembler>();
builder.Services.AddScoped<IAbsoluteUrlBuilder, DefaultAbsoluteUrlBuilder>(); builder.Services.AddScoped<IAbsoluteUrlBuilder, DefaultAbsoluteUrlBuilder>();

View File

@@ -9,12 +9,12 @@ using Umbraco.Extensions;
namespace Umbraco.Cms.Api.Management.Factories; namespace Umbraco.Cms.Api.Management.Factories;
public class FileItemPresentationModelFactory : IFileItemPresentationModelFactory public class FileItemPresentationFactory : IFileItemPresentationFactory
{ {
private readonly FileSystems _fileSystems; private readonly FileSystems _fileSystems;
private readonly IPhysicalFileSystem _physicalFileSystem; private readonly IPhysicalFileSystem _physicalFileSystem;
public FileItemPresentationModelFactory(FileSystems fileSystems, IPhysicalFileSystem physicalFileSystem) public FileItemPresentationFactory(FileSystems fileSystems, IPhysicalFileSystem physicalFileSystem)
{ {
_fileSystems = fileSystems; _fileSystems = fileSystems;
_physicalFileSystem = physicalFileSystem; _physicalFileSystem = physicalFileSystem;

View File

@@ -2,11 +2,10 @@
using Umbraco.Cms.Api.Management.ViewModels.Script.Item; using Umbraco.Cms.Api.Management.ViewModels.Script.Item;
using Umbraco.Cms.Api.Management.ViewModels.StaticFile.Item; using Umbraco.Cms.Api.Management.ViewModels.StaticFile.Item;
using Umbraco.Cms.Api.Management.ViewModels.Stylesheet.Item; using Umbraco.Cms.Api.Management.ViewModels.Stylesheet.Item;
using Umbraco.Cms.Core.IO;
namespace Umbraco.Cms.Api.Management.Factories; namespace Umbraco.Cms.Api.Management.Factories;
public interface IFileItemPresentationModelFactory public interface IFileItemPresentationFactory
{ {
IEnumerable<PartialViewItemResponseModel> CreatePartialViewItemResponseModels(IEnumerable<string> path); IEnumerable<PartialViewItemResponseModel> CreatePartialViewItemResponseModels(IEnumerable<string> path);

View File

@@ -7,7 +7,7 @@ using Umbraco.Cms.Core.Models.Entities;
namespace Umbraco.Cms.Api.Management.Factories; namespace Umbraco.Cms.Api.Management.Factories;
public interface IMediaPresentationModelFactory public interface IMediaPresentationFactory
{ {
Task<MediaResponseModel> CreateResponseModelAsync(IMedia media); Task<MediaResponseModel> CreateResponseModelAsync(IMedia media);

View File

@@ -14,8 +14,8 @@ using Umbraco.Extensions;
namespace Umbraco.Cms.Api.Management.Factories; namespace Umbraco.Cms.Api.Management.Factories;
internal sealed class MediaPresentationModelFactory internal sealed class MediaPresentationFactory
: ContentPresentationFactoryBase<IMediaType, IMediaTypeService>, IMediaPresentationModelFactory : ContentPresentationFactoryBase<IMediaType, IMediaTypeService>, IMediaPresentationFactory
{ {
private readonly IUmbracoMapper _umbracoMapper; private readonly IUmbracoMapper _umbracoMapper;
private readonly ContentSettings _contentSettings; private readonly ContentSettings _contentSettings;
@@ -23,7 +23,7 @@ internal sealed class MediaPresentationModelFactory
private readonly IAbsoluteUrlBuilder _absoluteUrlBuilder; private readonly IAbsoluteUrlBuilder _absoluteUrlBuilder;
private readonly IMediaTypeService _mediaTypeService; private readonly IMediaTypeService _mediaTypeService;
public MediaPresentationModelFactory( public MediaPresentationFactory(
IUmbracoMapper umbracoMapper, IUmbracoMapper umbracoMapper,
IOptions<ContentSettings> contentSettings, IOptions<ContentSettings> contentSettings,
MediaUrlGeneratorCollection mediaUrlGenerators, MediaUrlGeneratorCollection mediaUrlGenerators,

View File

@@ -1,7 +0,0 @@
namespace Umbraco.Cms.Core.Services.OperationStatus;
public enum ContentCreatingOperationStatus
{
Success,
NotFound
}

View File

@@ -12,7 +12,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Asp.Versioning.Mvc" /> <PackageReference Include="Asp.Versioning.Mvc" />
<PackageReference Include="Asp.Versioning.Mvc.ApiExplorer" /> <PackageReference Include="Asp.Versioning.Mvc.ApiExplorer" />
<PackageReference Include="Dazinator.Extensions.FileProviders" /> <PackageReference Include="Dazinator.Extensions.FileProviders" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" />