Skip to content

Commit 8975515

Browse files
authored
Support member saving Cancel (#16147)
* Fixes #15152 Handle when a notification cancels the member saving operation. * Fixed unit tests
1 parent a8021c4 commit 8975515

File tree

6 files changed

+28
-5
lines changed

6 files changed

+28
-5
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ protected IActionResult MemberEditingOperationStatusResult(MemberEditingOperatio
7171
.WithTitle("Duplicate email detected")
7272
.WithDetail("The supplied email is already in use by another member.")
7373
.Build()),
74+
MemberEditingOperationStatus.CancelledByNotificationHandler => BadRequest(problemDetailsBuilder
75+
.WithTitle("Cancelled")
76+
.Build()),
7477
MemberEditingOperationStatus.Unknown => StatusCode(
7578
StatusCodes.Status500InternalServerError,
7679
problemDetailsBuilder

src/Umbraco.Core/Services/OperationStatus/MemberEditingOperationStatus.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ public enum MemberEditingOperationStatus
1515
InvalidEmail,
1616
DuplicateUsername,
1717
DuplicateEmail,
18+
CancelledByNotificationHandler,
1819
Unknown,
1920
}

src/Umbraco.Infrastructure/Security/MemberUserStore.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ namespace Umbraco.Cms.Core.Security;
1919
public class MemberUserStore : UmbracoUserStore<MemberIdentityUser, UmbracoIdentityRole>, IMemberUserStore
2020
{
2121
private const string GenericIdentityErrorCode = "IdentityErrorUserStore";
22+
public const string CancelledIdentityErrorCode = "CancelledIdentityErrorUserStore";
2223
private readonly IExternalLoginWithKeyService _externalLoginService;
2324
private readonly IUmbracoMapper _mapper;
2425
private readonly IMemberService _memberService;
@@ -127,7 +128,17 @@ public override Task<IdentityResult> CreateAsync(
127128
UpdateMemberProperties(memberEntity, user, out bool _);
128129

129130
// create the member
130-
_memberService.Save(memberEntity);
131+
Attempt<OperationResult?> saveAttempt = _memberService.Save(memberEntity);
132+
if (saveAttempt.Success is false)
133+
{
134+
scope.Complete();
135+
return Task.FromResult(IdentityResult.Failed(
136+
new IdentityError {
137+
Code = CancelledIdentityErrorCode,
138+
Description = string.Empty
139+
140+
}));
141+
}
131142

132143
// We need to add roles now that the member has an Id. It do not work implicit in UpdateMemberProperties
133144
_memberService.AssignRoles(

src/Umbraco.Infrastructure/Services/MemberEditingService.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,9 @@ private static Attempt<MemberCreateResult, MemberEditingStatus> IdentityMemberCr
329329
case nameof(IdentityErrorDescriber.DuplicateEmail):
330330
createStatus = MemberEditingOperationStatus.DuplicateEmail;
331331
break;
332+
case MemberUserStore.CancelledIdentityErrorCode:
333+
createStatus = MemberEditingOperationStatus.CancelledByNotificationHandler;
334+
break;
332335
}
333336

334337
if (createStatus is not MemberEditingOperationStatus.Unknown)

tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberManagerTests.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Umbraco.Cms.Core;
99
using Umbraco.Cms.Core.Cache;
1010
using Umbraco.Cms.Core.Configuration.Models;
11+
using Umbraco.Cms.Core.Events;
1112
using Umbraco.Cms.Core.Mapping;
1213
using Umbraco.Cms.Core.Models;
1314
using Umbraco.Cms.Core.Net;
@@ -141,7 +142,7 @@ public async Task GivenICreateANewUser_AndTheUserIsPopulatedCorrectly_ThenIShoul
141142

142143
// assert
143144
Assert.IsTrue(identityResult.Succeeded);
144-
Assert.IsTrue(!identityResult.Errors.Any());
145+
Assert.IsFalse(identityResult.Errors.Any());
145146
}
146147

147148
[Test]
@@ -266,6 +267,9 @@ private void MockMemberServiceForCreateMember(IMember fakeMember)
266267
_mockMemberService
267268
.Setup(x => x.CreateMember(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
268269
.Returns(fakeMember);
269-
_mockMemberService.Setup(x => x.Save(fakeMember, Constants.Security.SuperUserId));
270+
_mockMemberService
271+
.Setup(x => x.Save(fakeMember, Constants.Security.SuperUserId))
272+
.Returns(Attempt.Succeed<OperationResult?>(null));
273+
270274
}
271275
}

tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberUserStoreTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,9 @@ public async Task GivenICreateANewUser_AndTheUserIsPopulatedCorrectly_ThenIShoul
123123
_mockMemberService
124124
.Setup(x => x.CreateMember(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
125125
.Returns(mockMember);
126-
_mockMemberService.Setup(x => x.Save(mockMember, Constants.Security.SuperUserId));
127-
126+
_mockMemberService
127+
.Setup(x => x.Save(mockMember, Constants.Security.SuperUserId))
128+
.Returns(Attempt.Succeed<OperationResult?>(null));
128129
// act
129130
var identityResult = await sut.CreateAsync(fakeUser, CancellationToken.None);
130131

0 commit comments

Comments
 (0)