V15: Dont create invalid media (#17534)
* Don't allow create when there is validation errors * Fix tests * Add tests * Fix last test * Fix more tests --------- Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
This commit is contained in:
@@ -46,6 +46,6 @@ public class CreateMediaController : CreateMediaControllerBase
|
||||
|
||||
return result.Success
|
||||
? CreatedAtId<ByKeyMediaController>(controller => nameof(controller.ByKey), result.Result.Content!.Key)
|
||||
: ContentEditingOperationStatusResult(result.Status);
|
||||
: MediaEditingOperationStatusResult(result.Status, requestModel, result.Result.ValidationResult);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -55,12 +55,18 @@ internal sealed class MediaEditingService
|
||||
ContentEditingOperationStatus validationStatus = result.Status;
|
||||
ContentValidationResult validationResult = result.Result.ValidationResult;
|
||||
|
||||
// If we have property validation errors, don't allow saving, as media only supports "published" status.
|
||||
if (result.Status == ContentEditingOperationStatus.PropertyValidationError)
|
||||
{
|
||||
return Attempt.FailWithStatus(validationStatus, new MediaCreateResult { ValidationResult = validationResult });
|
||||
}
|
||||
|
||||
IMedia media = result.Result.Content!;
|
||||
|
||||
var currentUserId = await GetUserIdAsync(userKey);
|
||||
ContentEditingOperationStatus operationStatus = Save(media, currentUserId);
|
||||
return operationStatus == ContentEditingOperationStatus.Success
|
||||
? Attempt.SucceedWithStatus(validationStatus, new MediaCreateResult { Content = media, ValidationResult = validationResult })
|
||||
? Attempt.SucceedWithStatus(validationStatus, new MediaCreateResult { Content = media })
|
||||
: Attempt.FailWithStatus(operationStatus, new MediaCreateResult { Content = media });
|
||||
}
|
||||
|
||||
|
||||
@@ -70,6 +70,8 @@ public abstract class UmbracoIntegrationTestWithMediaEditing : UmbracoIntegratio
|
||||
var mediaTypes = MediaTypeService.GetAll();
|
||||
var mediaTypesList = mediaTypes.ToList();
|
||||
var imageMediaType = mediaTypesList.FirstOrDefault(x => x.Alias == "Image");
|
||||
imageMediaType.PropertyTypes.First().Mandatory = false;
|
||||
MediaTypeService.Save(imageMediaType);
|
||||
|
||||
// Add CustomMediaType to FolderMediaType AllowedContentTypes
|
||||
var mediaTypeUpdateHelper = new MediaTypeUpdateHelper();
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Cms.Core;
|
||||
using Umbraco.Cms.Core.Models;
|
||||
using Umbraco.Cms.Core.Models.ContentEditing;
|
||||
using Umbraco.Cms.Core.Services;
|
||||
using Umbraco.Cms.Core.Services.OperationStatus;
|
||||
using Umbraco.Cms.Tests.Common.Testing;
|
||||
using Umbraco.Cms.Tests.Integration.Testing;
|
||||
|
||||
namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.Services;
|
||||
|
||||
[TestFixture]
|
||||
[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)]
|
||||
public class MediaEditingServiceTests : UmbracoIntegrationTest
|
||||
{
|
||||
protected IMediaTypeService MediaTypeService => GetRequiredService<IMediaTypeService>();
|
||||
|
||||
protected IMediaEditingService MediaEditingService => GetRequiredService<IMediaEditingService>();
|
||||
|
||||
protected IMediaType ImageMediaType { get; set; }
|
||||
|
||||
[SetUp]
|
||||
public async Task Setup()
|
||||
{
|
||||
ImageMediaType = MediaTypeService.Get(Constants.Conventions.MediaTypes.Image);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Cannot_Create_Media_With_Mandatory_Property()
|
||||
{
|
||||
var imageModel = CreateMediaCreateModel("Image", new Guid(), ImageMediaType.Key);
|
||||
var imageCreateAttempt = await MediaEditingService.CreateAsync(imageModel, Constants.Security.SuperUserKey);
|
||||
|
||||
// Assert
|
||||
Assert.IsFalse(imageCreateAttempt.Success);
|
||||
Assert.AreEqual(ContentEditingOperationStatus.PropertyValidationError, imageCreateAttempt.Status);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Can_Create_Media_Without_Mandatory_Property()
|
||||
{
|
||||
ImageMediaType.PropertyTypes.First(x => x.Alias == "umbracoFile").Mandatory = false;
|
||||
MediaTypeService.Save(ImageMediaType);
|
||||
var imageModel = CreateMediaCreateModel("Image", new Guid(), ImageMediaType.Key);
|
||||
var imageCreateAttempt = await MediaEditingService.CreateAsync(imageModel, Constants.Security.SuperUserKey);
|
||||
|
||||
// Assert
|
||||
Assert.IsTrue(imageCreateAttempt.Success);
|
||||
Assert.AreEqual(ContentEditingOperationStatus.Success, imageCreateAttempt.Status);
|
||||
}
|
||||
|
||||
private MediaCreateModel CreateMediaCreateModel(string name, Guid key, Guid mediaTypeKey)
|
||||
=> new()
|
||||
{
|
||||
ContentTypeKey = mediaTypeKey,
|
||||
ParentKey = Constants.System.RootKey,
|
||||
InvariantName = name,
|
||||
Key = key,
|
||||
};
|
||||
}
|
||||
@@ -21,6 +21,8 @@ public partial class MediaNavigationServiceTests : MediaNavigationServiceTestsBa
|
||||
// Media Types
|
||||
FolderMediaType = MediaTypeService.Get(Constants.Conventions.MediaTypes.Folder);
|
||||
ImageMediaType = MediaTypeService.Get(Constants.Conventions.MediaTypes.Image);
|
||||
ImageMediaType.PropertyTypes.First(x => x.Alias == "umbracoFile").Mandatory = false;
|
||||
MediaTypeService.Save(ImageMediaType);
|
||||
|
||||
// Media
|
||||
var albumModel = CreateMediaCreateModel("Album", new Guid("1CD97C02-8534-4B72-AE9E-AE52EC94CF31"), FolderMediaType.Key);
|
||||
|
||||
@@ -202,6 +202,8 @@ public class MediaListViewServiceTests : ContentListViewServiceTestsBase
|
||||
private async Task<IMedia> CreateRootMediaWithFiveChildrenAsListViewItems(Guid? listViewDataTypeKey = null)
|
||||
{
|
||||
var childImageMediaType = MediaTypeService.Get(Constants.Conventions.MediaTypes.Image);
|
||||
childImageMediaType.PropertyTypes.First(x => x.Alias == "umbracoFile").Mandatory = false;
|
||||
MediaTypeService.Save(childImageMediaType);
|
||||
|
||||
var mediaTypeWithListView = new MediaTypeBuilder()
|
||||
.WithAlias("album")
|
||||
|
||||
Reference in New Issue
Block a user