Skip to content

Commit d8659ca

Browse files
authored
Refactor content updates to shift responsibility downwards (#15807)
1 parent 33c1d4e commit d8659ca

File tree

18 files changed

+85
-93
lines changed

18 files changed

+85
-93
lines changed

src/Umbraco.Cms.Api.Management/Controllers/Document/UpdateDocumentController.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public UpdateDocumentController(
2424
IContentEditingService contentEditingService,
2525
IDocumentEditingPresentationFactory documentEditingPresentationFactory,
2626
IBackOfficeSecurityAccessor backOfficeSecurityAccessor)
27-
: base(authorizationService, contentEditingService)
27+
: base(authorizationService)
2828
{
2929
_contentEditingService = contentEditingService;
3030
_documentEditingPresentationFactory = documentEditingPresentationFactory;
@@ -37,11 +37,11 @@ public UpdateDocumentController(
3737
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
3838
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
3939
public async Task<IActionResult> Update(Guid id, UpdateDocumentRequestModel requestModel)
40-
=> await HandleRequest(id, requestModel, async content =>
40+
=> await HandleRequest(id, requestModel, async () =>
4141
{
4242
ContentUpdateModel model = _documentEditingPresentationFactory.MapUpdateModel(requestModel);
4343
Attempt<ContentUpdateResult, ContentEditingOperationStatus> result =
44-
await _contentEditingService.UpdateAsync(content, model, CurrentUserKey(_backOfficeSecurityAccessor));
44+
await _contentEditingService.UpdateAsync(id, model, CurrentUserKey(_backOfficeSecurityAccessor));
4545

4646
return result.Success
4747
? Ok()
Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
using Microsoft.AspNetCore.Authorization;
22
using Microsoft.AspNetCore.Mvc;
3-
using Umbraco.Cms.Api.Management.Security.Authorization.Content;
43
using Umbraco.Cms.Api.Management.ViewModels.Document;
54
using Umbraco.Cms.Core.Actions;
6-
using Umbraco.Cms.Core.Models;
75
using Umbraco.Cms.Core.Security.Authorization;
8-
using Umbraco.Cms.Core.Services;
96
using Umbraco.Cms.Web.Common.Authorization;
107
using Umbraco.Extensions;
118

@@ -14,15 +11,11 @@ namespace Umbraco.Cms.Api.Management.Controllers.Document;
1411
public abstract class UpdateDocumentControllerBase : DocumentControllerBase
1512
{
1613
private readonly IAuthorizationService _authorizationService;
17-
private readonly IContentEditingService _contentEditingService;
1814

19-
protected UpdateDocumentControllerBase(IAuthorizationService authorizationService, IContentEditingService contentEditingService)
20-
{
21-
_authorizationService = authorizationService;
22-
_contentEditingService = contentEditingService;
23-
}
15+
protected UpdateDocumentControllerBase(IAuthorizationService authorizationService)
16+
=> _authorizationService = authorizationService;
2417

25-
protected async Task<IActionResult> HandleRequest(Guid id, UpdateDocumentRequestModel requestModel, Func<IContent, Task<IActionResult>> authorizedHandler)
18+
protected async Task<IActionResult> HandleRequest(Guid id, UpdateDocumentRequestModel requestModel, Func<Task<IActionResult>> authorizedHandler)
2619
{
2720
IEnumerable<string> cultures = requestModel.Variants
2821
.Where(v => v.Culture is not null)
@@ -37,12 +30,6 @@ protected async Task<IActionResult> HandleRequest(Guid id, UpdateDocumentRequest
3730
return Forbidden();
3831
}
3932

40-
IContent? content = await _contentEditingService.GetAsync(id);
41-
if (content is null)
42-
{
43-
return DocumentNotFound();
44-
}
45-
46-
return await authorizedHandler(content);
33+
return await authorizedHandler();
4734
}
4835
}

src/Umbraco.Cms.Api.Management/Controllers/Document/ValidateUpdateDocumentController.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public ValidateUpdateDocumentController(
2121
IAuthorizationService authorizationService,
2222
IContentEditingService contentEditingService,
2323
IDocumentEditingPresentationFactory documentEditingPresentationFactory)
24-
: base(authorizationService, contentEditingService)
24+
: base(authorizationService)
2525
{
2626
_contentEditingService = contentEditingService;
2727
_documentEditingPresentationFactory = documentEditingPresentationFactory;
@@ -33,10 +33,10 @@ public ValidateUpdateDocumentController(
3333
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
3434
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
3535
public async Task<IActionResult> Validate(Guid id, UpdateDocumentRequestModel requestModel)
36-
=> await HandleRequest(id, requestModel, async content =>
36+
=> await HandleRequest(id, requestModel, async () =>
3737
{
3838
ContentUpdateModel model = _documentEditingPresentationFactory.MapUpdateModel(requestModel);
39-
Attempt<ContentValidationResult, ContentEditingOperationStatus> result = await _contentEditingService.ValidateUpdateAsync(content, model);
39+
Attempt<ContentValidationResult, ContentEditingOperationStatus> result = await _contentEditingService.ValidateUpdateAsync(id, model);
4040

4141
return result.Success
4242
? Ok()

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public UpdateMediaController(
2424
IMediaEditingService mediaEditingService,
2525
IMediaEditingPresentationFactory mediaEditingPresentationFactory,
2626
IBackOfficeSecurityAccessor backOfficeSecurityAccessor)
27-
: base(authorizationService, mediaEditingService)
27+
: base(authorizationService)
2828
{
2929
_mediaEditingService = mediaEditingService;
3030
_mediaEditingPresentationFactory = mediaEditingPresentationFactory;
@@ -37,11 +37,11 @@ public UpdateMediaController(
3737
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
3838
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
3939
public async Task<IActionResult> Update(Guid id, UpdateMediaRequestModel requestModel)
40-
=> await HandleRequest(id, async media =>
40+
=> await HandleRequest(id, async () =>
4141
{
4242
MediaUpdateModel model = _mediaEditingPresentationFactory.MapUpdateModel(requestModel);
4343
Attempt<MediaUpdateResult, ContentEditingOperationStatus> result =
44-
await _mediaEditingService.UpdateAsync(media, model, CurrentUserKey(_backOfficeSecurityAccessor));
44+
await _mediaEditingService.UpdateAsync(id, model, CurrentUserKey(_backOfficeSecurityAccessor));
4545

4646
return result.Success
4747
? Ok()
Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
using Microsoft.AspNetCore.Authorization;
22
using Microsoft.AspNetCore.Mvc;
3-
using Umbraco.Cms.Api.Management.Security.Authorization.Media;
4-
using Umbraco.Cms.Core.Models;
53
using Umbraco.Cms.Core.Security.Authorization;
6-
using Umbraco.Cms.Core.Services;
74
using Umbraco.Cms.Web.Common.Authorization;
85
using Umbraco.Extensions;
96

@@ -12,15 +9,11 @@ namespace Umbraco.Cms.Api.Management.Controllers.Media;
129
public abstract class UpdateMediaControllerBase : MediaControllerBase
1310
{
1411
private readonly IAuthorizationService _authorizationService;
15-
private readonly IMediaEditingService _mediaEditingService;
1612

17-
protected UpdateMediaControllerBase(IAuthorizationService authorizationService, IMediaEditingService mediaEditingService)
18-
{
19-
_authorizationService = authorizationService;
20-
_mediaEditingService = mediaEditingService;
21-
}
13+
protected UpdateMediaControllerBase(IAuthorizationService authorizationService)
14+
=> _authorizationService = authorizationService;
2215

23-
protected async Task<IActionResult> HandleRequest(Guid id, Func<IMedia, Task<IActionResult>> authorizedHandler)
16+
protected async Task<IActionResult> HandleRequest(Guid id, Func<Task<IActionResult>> authorizedHandler)
2417
{
2518
AuthorizationResult authorizationResult = await _authorizationService.AuthorizeResourceAsync(
2619
User,
@@ -32,12 +25,6 @@ protected async Task<IActionResult> HandleRequest(Guid id, Func<IMedia, Task<IAc
3225
return Forbidden();
3326
}
3427

35-
IMedia? media = await _mediaEditingService.GetAsync(id);
36-
if (media is null)
37-
{
38-
return MediaNotFound();
39-
}
40-
41-
return await authorizedHandler(media);
28+
return await authorizedHandler();
4229
}
4330
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public ValidateUpdateMediaController(
2121
IAuthorizationService authorizationService,
2222
IMediaEditingService mediaEditingService,
2323
IMediaEditingPresentationFactory mediaEditingPresentationFactory)
24-
: base(authorizationService, mediaEditingService)
24+
: base(authorizationService)
2525
{
2626
_mediaEditingService = mediaEditingService;
2727
_mediaEditingPresentationFactory = mediaEditingPresentationFactory;
@@ -33,10 +33,10 @@ public ValidateUpdateMediaController(
3333
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
3434
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
3535
public async Task<IActionResult> Validate(Guid id, UpdateMediaRequestModel requestModel)
36-
=> await HandleRequest(id, async content =>
36+
=> await HandleRequest(id, async () =>
3737
{
3838
MediaUpdateModel model = _mediaEditingPresentationFactory.MapUpdateModel(requestModel);
39-
Attempt<ContentValidationResult, ContentEditingOperationStatus> result = await _mediaEditingService.ValidateUpdateAsync(content, model);
39+
Attempt<ContentValidationResult, ContentEditingOperationStatus> result = await _mediaEditingService.ValidateUpdateAsync(id, model);
4040

4141
return result.Success
4242
? Ok()

src/Umbraco.Cms.Api.Management/Controllers/Member/UpdateMemberController.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using Umbraco.Cms.Api.Management.Factories;
55
using Umbraco.Cms.Api.Management.ViewModels.Member;
66
using Umbraco.Cms.Core;
7-
using Umbraco.Cms.Core.Models;
87
using Umbraco.Cms.Core.Models.ContentEditing;
98
using Umbraco.Cms.Core.Security;
109
using Umbraco.Cms.Core.Services;
@@ -36,14 +35,8 @@ public UpdateMemberController(
3635
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
3736
public async Task<IActionResult> Update(Guid id, UpdateMemberRequestModel updateRequestModel)
3837
{
39-
IMember? member = await _memberEditingService.GetAsync(id);
40-
if (member == null)
41-
{
42-
return MemberNotFound();
43-
}
44-
4538
MemberUpdateModel model = _memberEditingPresentationFactory.MapUpdateModel(updateRequestModel);
46-
Attempt<MemberUpdateResult, MemberEditingStatus> result = await _memberEditingService.UpdateAsync(member, model, CurrentUser(_backOfficeSecurityAccessor));
39+
Attempt<MemberUpdateResult, MemberEditingStatus> result = await _memberEditingService.UpdateAsync(id, model, CurrentUser(_backOfficeSecurityAccessor));
4740

4841
return result.Success
4942
? Ok()

src/Umbraco.Cms.Api.Management/Controllers/Member/ValidateUpdateMemberController.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using Umbraco.Cms.Api.Management.Factories;
55
using Umbraco.Cms.Api.Management.ViewModels.Member;
66
using Umbraco.Cms.Core;
7-
using Umbraco.Cms.Core.Models;
87
using Umbraco.Cms.Core.Models.ContentEditing;
98
using Umbraco.Cms.Core.Services;
109
using Umbraco.Cms.Core.Services.OperationStatus;
@@ -32,14 +31,8 @@ public ValidateUpdateMemberController(
3231
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
3332
public async Task<IActionResult> Validate(Guid id, UpdateMemberRequestModel requestModel)
3433
{
35-
IMember? member = await _memberEditingService.GetAsync(id);
36-
if (member is null)
37-
{
38-
return MemberNotFound();
39-
}
40-
4134
MemberUpdateModel model = _memberEditingPresentationFactory.MapUpdateModel(requestModel);
42-
Attempt<ContentValidationResult, ContentEditingOperationStatus> result = await _memberEditingService.ValidateUpdateAsync(member, model);
35+
Attempt<ContentValidationResult, ContentEditingOperationStatus> result = await _memberEditingService.ValidateUpdateAsync(id, model);
4336

4437
return result.Success
4538
? Ok()

src/Umbraco.Core/Models/ContentEditing/ContentUpdateResultBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
public abstract class ContentUpdateResultBase<TContent>
44
where TContent : class, IContentBase
55
{
6-
public TContent Content { get; init; } = null!;
6+
public TContent? Content { get; init; }
77

88
public ContentValidationResult ValidationResult { get; init; } = new();
99
}

src/Umbraco.Core/Services/ContentEditingService.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using Microsoft.Extensions.Logging;
22
using Umbraco.Cms.Core.Models;
33
using Umbraco.Cms.Core.Models.ContentEditing;
4-
using Umbraco.Cms.Core.Models.ContentEditing.Validation;
54
using Umbraco.Cms.Core.PropertyEditors;
65
using Umbraco.Cms.Core.Scoping;
76
using Umbraco.Cms.Core.Services.OperationStatus;
@@ -37,8 +36,13 @@ public ContentEditingService(
3736
return await Task.FromResult(content);
3837
}
3938

40-
public async Task<Attempt<ContentValidationResult, ContentEditingOperationStatus>> ValidateUpdateAsync(IContent content, ContentUpdateModel updateModel)
41-
=> await ValidatePropertiesAsync(updateModel, content.ContentType.Key);
39+
public async Task<Attempt<ContentValidationResult, ContentEditingOperationStatus>> ValidateUpdateAsync(Guid key, ContentUpdateModel updateModel)
40+
{
41+
IContent? content = ContentService.GetById(key);
42+
return content is not null
43+
? await ValidatePropertiesAsync(updateModel, content.ContentType.Key)
44+
: Attempt.FailWithStatus(ContentEditingOperationStatus.NotFound, new ContentValidationResult());
45+
}
4246

4347
public async Task<Attempt<ContentValidationResult, ContentEditingOperationStatus>> ValidateCreateAsync(ContentCreateModel createModel)
4448
=> await ValidatePropertiesAsync(createModel, createModel.ContentTypeKey);
@@ -69,8 +73,14 @@ public async Task<Attempt<ContentCreateResult, ContentEditingOperationStatus>> C
6973
: Attempt.FailWithStatus(saveStatus, new ContentCreateResult { Content = content });
7074
}
7175

72-
public async Task<Attempt<ContentUpdateResult, ContentEditingOperationStatus>> UpdateAsync(IContent content, ContentUpdateModel updateModel, Guid userKey)
76+
public async Task<Attempt<ContentUpdateResult, ContentEditingOperationStatus>> UpdateAsync(Guid key, ContentUpdateModel updateModel, Guid userKey)
7377
{
78+
IContent? content = ContentService.GetById(key);
79+
if (content is null)
80+
{
81+
return Attempt.FailWithStatus(ContentEditingOperationStatus.NotFound, new ContentUpdateResult());
82+
}
83+
7484
Attempt<ContentUpdateResult, ContentEditingOperationStatus> result = await MapUpdate<ContentUpdateResult>(content, updateModel);
7585
if (result.Success == false)
7686
{

0 commit comments

Comments
 (0)