Skip to content

Commit 8c2b1eb

Browse files
ZeegaanAndyButland
andauthored
V13: Introduce publishNotifications method on IMembershipMemberService (#18207)
* Introduce publishNotifications method on IMembershipMemberService.cs * Fix test * Add PublishNotificationSaveOptions * Fix up according to comments * Use numeric values for flag enum * Update src/Umbraco.Core/Services/MemberService.cs Co-authored-by: Andy Butland <[email protected]> * Update src/Umbraco.Core/Services/MemberService.cs Co-authored-by: Andy Butland <[email protected]> --------- Co-authored-by: Andy Butland <[email protected]>
1 parent 9227517 commit 8c2b1eb

File tree

5 files changed

+57
-9
lines changed

5 files changed

+57
-9
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
namespace Umbraco.Cms.Core.Models;
2+
3+
/// <summary>
4+
/// Specifies options for publishing notifcations when saving.
5+
/// </summary>
6+
[Flags]
7+
public enum PublishNotificationSaveOptions
8+
{
9+
/// <summary>
10+
/// Do not publish any notifications.
11+
/// </summary>
12+
None = 0,
13+
14+
/// <summary>
15+
/// Only publish the saving notification.
16+
/// </summary>
17+
Saving = 1,
18+
19+
/// <summary>
20+
/// Only publish the saved notification.
21+
/// </summary>
22+
Saved = 2,
23+
24+
/// <summary>
25+
/// Publish all the notifications.
26+
/// </summary>
27+
All = Saving | Saved,
28+
}

src/Umbraco.Core/Services/IMembershipMemberService.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,14 @@ public interface IMembershipMemberService<T> : IService
135135
/// <param name="entity"><see cref="IMember" /> or <see cref="IUser" /> to Save</param>
136136
void Save(T entity);
137137

138+
/// <summary>
139+
/// Saves an <see cref="IMembershipUser" />
140+
/// </summary>
141+
/// <remarks>An <see cref="IMembershipUser" /> can be of type <see cref="IMember" /> or <see cref="IUser" /></remarks>
142+
/// <param name="entity"><see cref="IMember" /> or <see cref="IUser" /> to Save</param>
143+
/// <param name="publishNotificationSaveOptions"> Enum for deciding which notifications to publish.</param>
144+
void Save(T entity, PublishNotificationSaveOptions publishNotificationSaveOptions) => Save(entity);
145+
138146
/// <summary>
139147
/// Saves a list of <see cref="IMembershipUser" /> objects
140148
/// </summary>

src/Umbraco.Core/Services/MemberService.cs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -743,7 +743,9 @@ public bool Exists(string username)
743743
public void SetLastLogin(string username, DateTime date) => throw new NotImplementedException();
744744

745745
/// <inheritdoc />
746-
public void Save(IMember member)
746+
public void Save(IMember member) => Save(member, PublishNotificationSaveOptions.All);
747+
748+
public void Save(IMember member, PublishNotificationSaveOptions publishNotificationSaveOptions)
747749
{
748750
// trimming username and email to make sure we have no trailing space
749751
member.Username = member.Username.Trim();
@@ -752,11 +754,15 @@ public void Save(IMember member)
752754
EventMessages evtMsgs = EventMessagesFactory.Get();
753755

754756
using ICoreScope scope = ScopeProvider.CreateCoreScope();
755-
var savingNotification = new MemberSavingNotification(member, evtMsgs);
756-
if (scope.Notifications.PublishCancelable(savingNotification))
757+
MemberSavingNotification? savingNotification = null;
758+
if (publishNotificationSaveOptions.HasFlag(PublishNotificationSaveOptions.Saving))
757759
{
758-
scope.Complete();
759-
return;
760+
savingNotification = new MemberSavingNotification(member, evtMsgs);
761+
if (scope.Notifications.PublishCancelable(savingNotification))
762+
{
763+
scope.Complete();
764+
return;
765+
}
760766
}
761767

762768
if (string.IsNullOrWhiteSpace(member.Name))
@@ -768,7 +774,13 @@ public void Save(IMember member)
768774

769775
_memberRepository.Save(member);
770776

771-
scope.Notifications.Publish(new MemberSavedNotification(member, evtMsgs).WithStateFrom(savingNotification));
777+
if (publishNotificationSaveOptions.HasFlag(PublishNotificationSaveOptions.Saved))
778+
{
779+
scope.Notifications.Publish(
780+
savingNotification is null
781+
? new MemberSavedNotification(member, evtMsgs)
782+
: new MemberSavedNotification(member, evtMsgs).WithStateFrom(savingNotification));
783+
}
772784

773785
Audit(AuditType.Save, 0, member.Id);
774786

src/Umbraco.Infrastructure/Security/MemberUserStore.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public override Task<IdentityResult> CreateAsync(
110110
UpdateMemberProperties(memberEntity, user, out bool _);
111111

112112
// create the member
113-
_memberService.Save(memberEntity);
113+
_memberService.Save(memberEntity, PublishNotificationSaveOptions.Saving);
114114

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

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public async Task GivenICreateANewUser_AndTheUserIsPopulatedCorrectly_ThenIShoul
122122
_mockMemberService
123123
.Setup(x => x.CreateMember(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
124124
.Returns(mockMember);
125-
_mockMemberService.Setup(x => x.Save(mockMember));
125+
_mockMemberService.Setup(x => x.Save(mockMember, PublishNotificationSaveOptions.Saving));
126126

127127
// act
128128
var identityResult = await sut.CreateAsync(fakeUser, CancellationToken.None);
@@ -132,7 +132,7 @@ public async Task GivenICreateANewUser_AndTheUserIsPopulatedCorrectly_ThenIShoul
132132
Assert.IsTrue(!identityResult.Errors.Any());
133133
_mockMemberService.Verify(x =>
134134
x.CreateMember(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()));
135-
_mockMemberService.Verify(x => x.Save(mockMember));
135+
_mockMemberService.Verify(x => x.Save(mockMember, PublishNotificationSaveOptions.Saving));
136136
}
137137

138138
[Test]

0 commit comments

Comments
 (0)