diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Content/ContentControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Content/ContentControllerBase.cs index d8d7582e28..67c738e83b 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Content/ContentControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Content/ContentControllerBase.cs @@ -1,10 +1,8 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; 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.Validation; -using Umbraco.Cms.Core.Models.ContentPublishing; using Umbraco.Cms.Core.Services.OperationStatus; using Umbraco.Extensions; @@ -63,7 +61,8 @@ public class ContentControllerBase : ManagementApiControllerBase .WithTitle("Invalid sorting options") .WithDetail("The supplied sorting operations were invalid. Additional details can be found in the log.") .Build()), - ContentEditingOperationStatus.Unknown => StatusCode(StatusCodes.Status500InternalServerError, + ContentEditingOperationStatus.Unknown => StatusCode( + StatusCodes.Status500InternalServerError, problemDetailsBuilder .WithTitle("Unknown error. Please see the log for more details.") .Build()), @@ -112,125 +111,4 @@ public class ContentControllerBase : ManagementApiControllerBase .WithExtension("missingProperties", missingPropertyAliases.ToArray()) .Build())); } - - protected IActionResult ContentPublishingOperationStatusResult( - ContentPublishingOperationStatus status, - IEnumerable? invalidPropertyAliases = null, - IEnumerable? 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()) - .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()) - .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()), - }); } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Document/DocumentControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Document/DocumentControllerBase.cs index f98e5bf12a..9417fae3e2 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Document/DocumentControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Document/DocumentControllerBase.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Management.Controllers.Content; 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.Core; using Umbraco.Cms.Core.Models.ContentEditing; +using Umbraco.Cms.Core.Models.ContentPublishing; using Umbraco.Cms.Core.Services.OperationStatus; using Umbraco.Cms.Web.Common.Authorization; @@ -20,7 +22,7 @@ public abstract class DocumentControllerBase : ContentControllerBase protected IActionResult DocumentNotFound() => OperationStatusResult(ContentEditingOperationStatus.NotFound, problemDetailsBuilder => NotFound(problemDetailsBuilder - .WithTitle("The requested Document could not be found") + .WithTitle("The document could not be found") .Build())); protected IActionResult DocumentEditingOperationStatusResult( @@ -29,4 +31,114 @@ public abstract class DocumentControllerBase : ContentControllerBase ContentValidationResult validationResult) where TContentModelBase : ContentModelBase => ContentEditingOperationStatusResult(status, requestModel, validationResult); + + protected IActionResult DocumentPublishingOperationStatusResult( + ContentPublishingOperationStatus status, + IEnumerable? invalidPropertyAliases = null, + IEnumerable? 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()) + .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()) + .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()), + }); } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Document/PublishDocumentController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Document/PublishDocumentController.cs index 933568871a..1b3ab6cb9d 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Document/PublishDocumentController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Document/PublishDocumentController.cs @@ -56,6 +56,6 @@ public class PublishDocumentController : DocumentControllerBase CurrentUserKey(_backOfficeSecurityAccessor)); return attempt.Success ? Ok() - : ContentPublishingOperationStatusResult(attempt.Status, invalidPropertyAliases: attempt.Result.InvalidPropertyAliases); + : DocumentPublishingOperationStatusResult(attempt.Status, invalidPropertyAliases: attempt.Result.InvalidPropertyAliases); } } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Document/PublishDocumentWithDescendantsController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Document/PublishDocumentWithDescendantsController.cs index 9b457d6565..15cfc6daec 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Document/PublishDocumentWithDescendantsController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Document/PublishDocumentWithDescendantsController.cs @@ -57,6 +57,6 @@ public class PublishDocumentWithDescendantsController : DocumentControllerBase return attempt.Success ? Ok() - : ContentPublishingOperationStatusResult(attempt.Status, failedBranchItems: attempt.Result.FailedItems); + : DocumentPublishingOperationStatusResult(attempt.Status, failedBranchItems: attempt.Result.FailedItems); } } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Document/UnpublishDocumentController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Document/UnpublishDocumentController.cs index f0538402ae..52515305e1 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Document/UnpublishDocumentController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Document/UnpublishDocumentController.cs @@ -58,6 +58,6 @@ public class UnpublishDocumentController : DocumentControllerBase CurrentUserKey(_backOfficeSecurityAccessor)); return attempt.Success ? Ok() - : ContentPublishingOperationStatusResult(attempt.Result); + : DocumentPublishingOperationStatusResult(attempt.Result); } } diff --git a/src/Umbraco.Core/Services/OperationStatus/ContentCreatingOperationStatus.cs b/src/Umbraco.Core/Services/OperationStatus/ContentCreatingOperationStatus.cs deleted file mode 100644 index a1eb3226a2..0000000000 --- a/src/Umbraco.Core/Services/OperationStatus/ContentCreatingOperationStatus.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Cms.Core.Services.OperationStatus; - -public enum ContentCreatingOperationStatus -{ - Success, - NotFound -}