diff --git a/Umbraco.Docs.Samples.Web/Controllers/UmbAlternativeRegisterController.cs b/Umbraco.Docs.Samples.Web/Controllers/UmbAlternativeRegisterController.cs new file mode 100644 index 0000000..4951fe5 --- /dev/null +++ b/Umbraco.Docs.Samples.Web/Controllers/UmbAlternativeRegisterController.cs @@ -0,0 +1,180 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Umbraco.Cms.Core.Cache; +using Umbraco.Cms.Core.Logging; +using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Routing; +using Umbraco.Cms.Core.Scoping; +using Umbraco.Cms.Core.Security; +using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Core.Web; +using Umbraco.Cms.Infrastructure.Persistence; +using Umbraco.Cms.Web.Common.Filters; +using Umbraco.Cms.Web.Common.Security; +using Umbraco.Cms.Web.Website.Controllers; +using Umbraco.Cms.Web.Website.Models; + +namespace Umbraco.Docs.Samples.Web.Controllers +{ + public class UmbAlternativeRegisterController : SurfaceController + { + private readonly IMemberManager _memberManager; + private readonly IMemberService _memberService; + private readonly IMemberSignInManager _memberSignInManager; + private readonly ICoreScopeProvider _coreScopeProvider; + + public UmbAlternativeRegisterController( + IMemberManager memberManager, + IMemberService memberService, + IUmbracoContextAccessor umbracoContextAccessor, + IUmbracoDatabaseFactory databaseFactory, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger profilingLogger, + IPublishedUrlProvider publishedUrlProvider, + IMemberSignInManager memberSignInManager, + ICoreScopeProvider coreScopeProvider) + : base(umbracoContextAccessor, databaseFactory, services, appCaches, profilingLogger, publishedUrlProvider) + { + _memberManager = memberManager; + _memberService = memberService; + _memberSignInManager = memberSignInManager; + _coreScopeProvider = coreScopeProvider; + } + + [HttpPost] + [ValidateAntiForgeryToken] + [ValidateUmbracoFormRouteString] + public async Task HandleRegisterMember([Bind(Prefix = "registerModel")] RegisterModel model) + { + if (ModelState.IsValid == false) + { + return CurrentUmbracoPage(); + } + + MergeRouteValuesToModel(model); + + IdentityResult result = await RegisterMemberAsync(model); + if (result.Succeeded) + { + TempData["FormSuccess"] = true; + + + if (model.RedirectUrl.IsNullOrWhiteSpace() == false) + { + return Redirect(model.RedirectUrl!); + } + + + return RedirectToCurrentUmbracoPage(); + } + + AddErrors(result); + return CurrentUmbracoPage(); + } + + /// + /// + /// + /// + private void MergeRouteValuesToModel(RegisterModel model) + { + if (RouteData.Values.TryGetValue(nameof(RegisterModel.RedirectUrl), out var redirectUrl) && redirectUrl != null) + { + model.RedirectUrl = redirectUrl.ToString(); + } + + if (RouteData.Values.TryGetValue(nameof(RegisterModel.MemberTypeAlias), out var memberTypeAlias) && + memberTypeAlias != null) + { + model.MemberTypeAlias = memberTypeAlias.ToString()!; + } + + if (RouteData.Values.TryGetValue(nameof(RegisterModel.UsernameIsEmail), out var usernameIsEmail) && + usernameIsEmail != null) + { + model.UsernameIsEmail = usernameIsEmail.ToString() == "True"; + } + } + + private void AddErrors(IdentityResult result) + { + foreach (IdentityError? error in result.Errors) + { + ModelState.AddModelError("registerModel", error.Description); + } + } + + //Here we created a helper Method to assign a MemberGroup to a member. + private void AssignMemberGroup(string email, string group) + { + try + { + _memberService.AssignRole(email, group); + } + catch (Exception ex) + { + //handle the exception + } + + } + + + /// + + /// + /// Register member model. + /// Flag for whether to log the member in upon successful registration. + /// Result of registration operation. + private async Task RegisterMemberAsync(RegisterModel model, bool logMemberIn = true) + { + using ICoreScope scope = _coreScopeProvider.CreateCoreScope(autoComplete: true); + + + if (string.IsNullOrEmpty(model.Name) && string.IsNullOrEmpty(model.Email) == false) + { + model.Name = model.Email; + } + + model.Username = model.UsernameIsEmail || model.Username == null ? model.Email : model.Username; + + var identityUser = + MemberIdentityUser.CreateNew(model.Username, model.Email, model.MemberTypeAlias, true, model.Name); + IdentityResult identityResult = await _memberManager.CreateAsync( + identityUser, + model.Password); + + if (identityResult.Succeeded) + { + + IMember? member = _memberService.GetByKey(identityUser.Key); + if (member == null) + { + + throw new InvalidOperationException($"Could not find a member with key: {member?.Key}."); + } + + foreach (MemberPropertyModel property in model.MemberProperties.Where(p => p.Value != null).Where(property => member.Properties.Contains(property.Alias))) + { + member.Properties[property.Alias]?.SetValue(property.Value); + } + + //Before we save the member we make sure to assign the group, for this the "Group" must exist in the backoffice. + string memberGroup = "professionals"; + AssignMemberGroup(model.Email, memberGroup); + + _memberService.Save(member); + + if (logMemberIn) + { + await _memberSignInManager.SignInAsync(identityUser, false); + } + } + + return identityResult; + } + } +} \ No newline at end of file diff --git a/Umbraco.Docs.Samples.Web/Views/ContentPage.cshtml b/Umbraco.Docs.Samples.Web/Views/ContentPage.cshtml index 98e125d..7e9c4d0 100644 --- a/Umbraco.Docs.Samples.Web/Views/ContentPage.cshtml +++ b/Umbraco.Docs.Samples.Web/Views/ContentPage.cshtml @@ -33,6 +33,10 @@
+ +
+

Members

+

Cheat sheet - Standard Model Properties

diff --git a/Umbraco.Docs.Samples.Web/Views/MacroPartials/LatestBlogposts.cshtml b/Umbraco.Docs.Samples.Web/Views/MacroPartials/LatestBlogposts.cshtml index bafaf2e..34d0aa9 100644 --- a/Umbraco.Docs.Samples.Web/Views/MacroPartials/LatestBlogposts.cshtml +++ b/Umbraco.Docs.Samples.Web/Views/MacroPartials/LatestBlogposts.cshtml @@ -10,11 +10,8 @@ @{ var startNodeId = Model.MacroParameters["startNodeId"] ?? Model.Content.Id; - var numberOfPosts = 3; - if (Model.MacroParameters["numberOfPosts"] != null) - { - int.TryParse((string)Model.MacroParameters["numberOfPosts"], out numberOfPosts); - } + + var numberOfMorePosts = Model.GetParameterValue("numberOfPosts"); } @if (startNodeId != null) @@ -35,7 +32,7 @@ //Gets all blogposts to calculate pages var blogposts = startNode.Children.OrderBy(x => x.CreateDate).ToList(); - var pageCount = (int)Math.Ceiling((double)blogposts.Count / (double)numberOfPosts); + var pageCount = (int)Math.Ceiling((double)blogposts.Count / (double)numberOfMorePosts); //gets the page from the querystring and sets it to one if it is out of range var page = 1; if (httpContext != null && !string.IsNullOrEmpty(httpContext.Request.Query["page"])) @@ -47,7 +44,7 @@ } } //Gets the blogposts for the current page - var pagedBlogposts = blogposts.Skip((page - 1) * numberOfPosts).Take(numberOfPosts).ToList(); + var pagedBlogposts = blogposts.Skip((page - 1) * numberOfMorePosts).Take(numberOfMorePosts).ToList(); if (pagedBlogposts.Count > 0) { @@ -69,7 +66,7 @@
} - if (blogposts.Count > numberOfPosts) + if (blogposts.Count > numberOfMorePosts) {