Property level validation for Management API (#15644)

* Property level validation for content - initial implementation

* Always succeed create/update regardless of property level validation errors

* Move old complex editor validation classes to Web.BackOffice so they will be deleted

* Include operation status and property validation errors in ProblemDetails

* Refactor property validation to its own service(s)

* Make the problem details builder a little more generic towards extensions

* Validation for item and branch publish

* Moved malplaced test

* Get rid of a TODO

* Integration tests for content validation service

* Simplify validation service

* Add missing response types to create and update for document and media

* Remove test that no longer applies

* Use "errors" for model validation errors (property validation errors)

* Split create/update and validation into their own endpoints

* Fix forward merge

* Correct wrong assumption for missing properties

* Remove localization from validation error messages - decreases dependencies, adds a lot of obsolete constructors

* Reuse existing validation service + support custom error messages

* Fix merge errors

* Review comments
This commit is contained in:
Kenn Jacobsen
2024-01-31 10:40:58 +01:00
committed by GitHub
parent e0e6dee896
commit aaf7075313
86 changed files with 2052 additions and 898 deletions

View File

@@ -0,0 +1,45 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.Factories;
using Umbraco.Cms.Api.Management.ViewModels.Media;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Models.ContentEditing;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Services.OperationStatus;
namespace Umbraco.Cms.Api.Management.Controllers.Media;
[ApiVersion("1.0")]
public class ValidateUpdateMediaController : UpdateMediaControllerBase
{
private readonly IMediaEditingService _mediaEditingService;
private readonly IMediaEditingPresentationFactory _mediaEditingPresentationFactory;
public ValidateUpdateMediaController(
IAuthorizationService authorizationService,
IMediaEditingService mediaEditingService,
IMediaEditingPresentationFactory mediaEditingPresentationFactory)
: base(authorizationService, mediaEditingService)
{
_mediaEditingService = mediaEditingService;
_mediaEditingPresentationFactory = mediaEditingPresentationFactory;
}
[HttpPut("{id:guid}/validate")]
[MapToApiVersion("1.0")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> Validate(Guid id, UpdateMediaRequestModel requestModel)
=> await HandleRequest(id, async content =>
{
MediaUpdateModel model = _mediaEditingPresentationFactory.MapUpdateModel(requestModel);
Attempt<ContentValidationResult, ContentEditingOperationStatus> result = await _mediaEditingService.ValidateUpdateAsync(content, model);
return result.Success
? Ok()
: MediaEditingOperationStatusResult(result.Status, requestModel, result.Result);
});
}