/// <summary>
        /// Converts UserProfileModel object to WebUser model object
        /// </summary>
        /// <param name="webUser">WebUser object</param>
        /// <param name="model">UserProfileModel object</param>
        public static WebUser FromUserProfile(this WebUser webUser, UserProfileModel model)
        {
            if (model == null)
            {
                return webUser;
            }

            webUser.BirthDate = model.BirthDate;
            webUser.FirstName = model.FirstName;
            webUser.LastName = model.LastName;
            webUser.Mobile = model.Mobile;
            webUser.UserName = model.Email;
            webUser.PersonCode = model.PersonCode;

            return webUser;
        }
 public async Task AccountStrongUserCreateNewUserSuccessCallsAllOperations()
 {
     this.userManagerMock.Setup(mock => mock.GenerateEmailConfirmationTokenAsyncWrap(this.webUser.Id)).Returns(Task.FromResult("123123123"));
     this.userManagerMock.Setup(mock => mock.FindByEmailAsyncWrap(It.IsAny<string>())).Returns(Task.FromResult<WebUser>(null));
     this.userManagerMock.Setup(m => m.CreateAsyncWrap(It.IsAny<string>(), null))
         .Returns(Task.FromResult(new Tuple<IdentityResult, int>(IdentityResult.Success, this.webUser.Id)));
     this.userManagerMock.Setup(m => m.UpdateAsyncWrap(this.webUser.Id, It.IsAny<WebUser>()))
         .Returns(Task.FromResult(IdentityResult.Success));
     this.accountController.UserManager = this.userManagerMock.Object;
     var model = new UserProfileModel { Email = this.webUser.UserName };
     var result = await this.accountController.StrongUserCreate(model);
     result.Should().BeViewResult().WithViewName("~/Features/Account/DisplayEmailConfirmation.cshtml");
     this.userManagerMock.Verify(m => m.CreateAsyncWrap(It.IsAny<string>(), It.IsAny<string>()), Times.Once);
     this.userManagerMock.Verify(m => m.UpdateAsyncWrap(It.IsAny<int>(), It.IsAny<WebUser>()), Times.Once);
     this.userManagerMock.Verify(m => m.GenerateEmailConfirmationTokenAsyncWrap(this.webUser.Id), Times.Once);
 }
 public async Task AccountStrongUserCreateNewUserFailureReturnsToRegister()
 {
     this.userManagerMock.Setup(mock => mock.FindByEmailAsyncWrap(It.IsAny<string>())).Returns(Task.FromResult<WebUser>(null));
     this.userManagerMock.Setup(m => m.CreateAsyncWrap(It.IsAny<string>(), null))
         .Returns(Task.FromResult(new Tuple<IdentityResult, int>(IdentityResult.Failed(new string[] { "kaka" }), 0)));
     this.accountController.UserManager = this.userManagerMock.Object;
     var model = new UserProfileModel { Email = RandomData.GetEmailAddress() };
     var result = await this.accountController.StrongUserCreate(model);
     result.Should().BeViewResult().WithViewName("~/Features/Account/RegistrationForm.cshtml");
     this.userManagerMock.Verify(m => m.CreateAsyncWrap(It.IsAny<string>(), It.IsAny<string>()), Times.Once);
 }
 public async Task AccountStrongUserCreateProhibitEmailReuse()
 {
     var model = new UserProfileModel();
     var result = await this.accountController.StrongUserCreate(model);
     result.Should().BeRedirectToRouteResult().WithAction("login");
     this.userManagerMock.Verify(m => m.CreateAsyncWrap(It.IsAny<string>(), It.IsAny<string>()), Times.Never);
 }
        public virtual async Task<ActionResult> StrongUserCreate(UserProfileModel model)
        {
            if (model == null)
            {
                // TODO: Add master data translations for those
                this.WebMessages.AddErrorMessage(this.T("User profile"), this.T("User profile data was not present in request"));
                return this.RedirectBack();
            }

            if (!this.ModelState.IsValid)
            {
                return this.View(MVC.Account.Views.UserProfileStrongEdit, model);
            }

            var existingUser = await this.UserManager.FindByEmailAsyncWrap(model.Email);
            if (existingUser != null)
            {
                // TODO: Add master data translations for those
                this.WebMessages.AddInfoMessage(this.T("User account"), this.T("User with given e-mail address already exists. Please, signIn with e-mail address and password and then upgrade account."));
                return this.RedirectToAction(MVC.Account.Login());
            }

            var result = await this.UserManager.CreateAsyncWrap(model.Email, null);
            if (result.Item1.Succeeded && result.Item2 != 0)
            {
                WebUser user = new WebUser().FromUserProfile(model);
                user.Id = result.Item2;
                user.IsStronglyAuthenticated = true;
                var updateResult = await this.UserManager.UpdateAsyncWrap(result.Item2, user);
                if (updateResult.Succeeded)
                {
                    // Sign in Vetuma user automatically
                    await this.SignInManager.SignInAsyncWrap(user, true, false);

                    // Create all necessary information to send e-mail verification
                    string callbackUrl = await this.SendEmailVerificationToken(user.Id);
#if !PROD
                    // For testing this will show same link in next page, to ease confirmation procedure
                    ViewBag.Link = callbackUrl;
#endif
                    return this.View(MVC.Account.Views.DisplayEmailConfirmation);
                }

                return this.RedirectBack();
            }

            foreach (var errorMessage in result.Item1.Errors)
            {
                this.WebMessages.AddErrorMessage(errorMessage);
            }

            return this.View(MVC.Account.Views.RegistrationForm, model);
        }
        public virtual async Task<ActionResult> UserProfileFullSave(UserProfileModel model)
        {
            WebUser oldUserData = await this.UserManager.FindByIdAsyncWrap(int.Parse(User.Identity.GetUserId()));
            if (!ModelState.IsValid)
            {
                if (Request.UrlReferrer.LocalPath == "/account/userprofilefulledit")
                {
                    return this.View(MVC.Account.Views.UserProfileFullEdit, model);
                }

                if (oldUserData.IsStronglyAuthenticated)
                {
                    return this.View(MVC.Account.Views.UserProfileStrong, model);
                }

                return this.View(MVC.Account.Views.UserProfile, model);
            }

            bool isUserNameChanged = oldUserData.UserName != model.Email;
            WebUser userData = oldUserData.FromUserProfile(model);
            var result = await this.UserManager.UpdateAsyncWrap(int.Parse(User.Identity.GetUserId()), userData);
            IdentityResult emailResetResult = new IdentityResult();
            if (isUserNameChanged)
            {
                emailResetResult = await this.UserManager.SetEmailAsyncWrap(int.Parse(User.Identity.GetUserId()), model.Email);
            }

            if (result.Succeeded)
            {
                var user = await this.UserManager.FindByIdAsyncWrap(int.Parse(User.Identity.GetUserId()));
                if (user != null)
                {
                    await this.SignInManager.RelogonUserAsyncWrap(user, false);

                    // Check whether e-mail confirmation is required
                    if (isUserNameChanged && emailResetResult.Succeeded)
                    {
                        // Create all necessary information to send e-mail verification
                        string callbackUrl = await this.SendEmailVerificationToken(int.Parse(User.Identity.GetUserId()));

                        // Need to logoff user, so he is forced and guided to log in back again with new username/e-mail
                        this.AuthenticationManager.SignOut();
#if !PROD
                        // For testing this will show same link in next page, to ease confirmation procedure
                        ViewBag.Link = callbackUrl;
#endif
                        return this.View(MVC.Account.Views.ViewNames.DisplayEmailConfirmation);
                    }
                }

                // TODO: Add master data translations for those
                this.WebMessages.AddSuccessMessage(this.T("User profile"), this.T("User profile data changed succesfully"));
                return this.RedirectToAction(MVC.Account.UserProfile());
            }
            
            if (this.Request.UrlReferrer.LocalPath == "/account/userprofilefulledit")
            {
                return this.View(MVC.Account.Views.UserProfileFullEdit, model);
            }

            if (oldUserData.IsStronglyAuthenticated)
            {
                return this.View(MVC.Account.Views.UserProfileStrong, model);
            }

            return this.View(MVC.Account.Views.UserProfile, model);
        }