Skip to content

Commit 53a5813

Browse files
ZeegaaniOvergaard
andcommitted
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 <[email protected]>
1 parent 77b6e6e commit 53a5813

File tree

4 files changed

+70
-2
lines changed

4 files changed

+70
-2
lines changed

src/Umbraco.Cms.Api.Management/Controllers/Media/CreateMediaController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,6 @@ public async Task<IActionResult> Create(
4646

4747
return result.Success
4848
? CreatedAtId<ByKeyMediaController>(controller => nameof(controller.ByKey), result.Result.Content!.Key)
49-
: ContentEditingOperationStatusResult(result.Status);
49+
: MediaEditingOperationStatusResult(result.Status, requestModel, result.Result.ValidationResult);
5050
});
5151
}

src/Umbraco.Core/Services/MediaEditingService.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,18 @@ public async Task<Attempt<MediaCreateResult, ContentEditingOperationStatus>> Cre
5555
ContentEditingOperationStatus validationStatus = result.Status;
5656
ContentValidationResult validationResult = result.Result.ValidationResult;
5757

58+
// If we have property validation errors, don't allow saving, as media only supports "published" status.
59+
if (result.Status == ContentEditingOperationStatus.PropertyValidationError)
60+
{
61+
return Attempt.FailWithStatus(validationStatus, new MediaCreateResult { ValidationResult = validationResult });
62+
}
63+
5864
IMedia media = result.Result.Content!;
5965

6066
var currentUserId = await GetUserIdAsync(userKey);
6167
ContentEditingOperationStatus operationStatus = Save(media, currentUserId);
6268
return operationStatus == ContentEditingOperationStatus.Success
63-
? Attempt.SucceedWithStatus(validationStatus, new MediaCreateResult { Content = media, ValidationResult = validationResult })
69+
? Attempt.SucceedWithStatus(validationStatus, new MediaCreateResult { Content = media })
6470
: Attempt.FailWithStatus(operationStatus, new MediaCreateResult { Content = media });
6571
}
6672

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using NUnit.Framework;
2+
using Umbraco.Cms.Core;
3+
using Umbraco.Cms.Core.Models;
4+
using Umbraco.Cms.Core.Models.ContentEditing;
5+
using Umbraco.Cms.Core.Services;
6+
using Umbraco.Cms.Core.Services.OperationStatus;
7+
using Umbraco.Cms.Tests.Common.Testing;
8+
using Umbraco.Cms.Tests.Integration.Testing;
9+
10+
namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.Services;
11+
12+
[TestFixture]
13+
[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)]
14+
public class MediaEditingServiceTests : UmbracoIntegrationTest
15+
{
16+
protected IMediaTypeService MediaTypeService => GetRequiredService<IMediaTypeService>();
17+
18+
protected IMediaEditingService MediaEditingService => GetRequiredService<IMediaEditingService>();
19+
20+
protected IMediaType ImageMediaType { get; set; }
21+
22+
[SetUp]
23+
public async Task Setup()
24+
{
25+
ImageMediaType = MediaTypeService.Get(Constants.Conventions.MediaTypes.Image);
26+
}
27+
28+
[Test]
29+
public async Task Cannot_Create_Media_With_Mandatory_Property()
30+
{
31+
var imageModel = CreateMediaCreateModel("Image", new Guid(), ImageMediaType.Key);
32+
var imageCreateAttempt = await MediaEditingService.CreateAsync(imageModel, Constants.Security.SuperUserKey);
33+
34+
// Assert
35+
Assert.IsFalse(imageCreateAttempt.Success);
36+
Assert.AreEqual(ContentEditingOperationStatus.PropertyValidationError, imageCreateAttempt.Status);
37+
}
38+
39+
[Test]
40+
public async Task Can_Create_Media_Without_Mandatory_Property()
41+
{
42+
ImageMediaType.PropertyTypes.First(x => x.Alias == "umbracoFile").Mandatory = false;
43+
MediaTypeService.Save(ImageMediaType);
44+
var imageModel = CreateMediaCreateModel("Image", new Guid(), ImageMediaType.Key);
45+
var imageCreateAttempt = await MediaEditingService.CreateAsync(imageModel, Constants.Security.SuperUserKey);
46+
47+
// Assert
48+
Assert.IsTrue(imageCreateAttempt.Success);
49+
Assert.AreEqual(ContentEditingOperationStatus.Success, imageCreateAttempt.Status);
50+
}
51+
52+
private MediaCreateModel CreateMediaCreateModel(string name, Guid key, Guid mediaTypeKey)
53+
=> new()
54+
{
55+
ContentTypeKey = mediaTypeKey,
56+
ParentKey = Constants.System.RootKey,
57+
InvariantName = name,
58+
Key = key,
59+
};
60+
}

tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/MediaListViewServiceTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,8 @@ private void CreateTenMediaItemsFromTwoMediaTypesAtRoot()
202202
private async Task<IMedia> CreateRootMediaWithFiveChildrenAsListViewItems(Guid? listViewDataTypeKey = null)
203203
{
204204
var childImageMediaType = MediaTypeService.Get(Constants.Conventions.MediaTypes.Image);
205+
childImageMediaType.PropertyTypes.First(x => x.Alias == "umbracoFile").Mandatory = false;
206+
MediaTypeService.Save(childImageMediaType);
205207

206208
var mediaTypeWithListView = new MediaTypeBuilder()
207209
.WithAlias("album")

0 commit comments

Comments
 (0)