public ActionResult Register(RegistrationViewModel registrationViewModel)
 {
     return this.RegisterInternal(registrationViewModel, "Sorry, that email address has already been registered.",
         createUser: (pwd) => new Parent(registrationViewModel.Name, registrationViewModel.Email, pwd).Initialise(),
         confirmAction: () => this.RedirectToAction("Confirm"),
         invalidModelStateAction: () => this.View("Register", registrationViewModel)
         );
 }
        ActionResult RegisterInternal(
            RegistrationViewModel registrationViewModel,
            string usernameTakenMessage,
            Func<string, User> createUser,
            Func<ActionResult> confirmAction, 
            Func<ActionResult> invalidModelStateAction,
            Action<User> afterUserCreated = null)
        {
            if (registrationViewModel == null)
            {
                throw new ArgumentNullException("registrationViewModel");
            }
            if (createUser == null)
            {
                throw new ArgumentNullException("createUser");
            }
            if (confirmAction == null)
            {
                throw new ArgumentNullException("confirmAction");
            }
            if (invalidModelStateAction == null)
            {
                throw new ArgumentNullException("invalidModelStateAction");
            }

            if (this.ModelState.IsValid)
            {
                var conflictedUser = this.userService.GetUserByUserName(registrationViewModel.Email);
                if (conflictedUser != null)
                {
                    this.ModelState.AddModelError("Email", usernameTakenMessage);
                    return invalidModelStateAction();
                }

                var hashedPassword = this.formsAuthenticationService.HashAndSalt(
                    registrationViewModel.Email,
                    registrationViewModel.Password);

                var user = createUser(hashedPassword);

                if (string.IsNullOrWhiteSpace(this.configuration.EmailSmtpServer))
                {
                    // if no smtp server configured, just activate user as no email is sent out.
                    user.Activate();
                }

                this.userService.SaveUser(user);

                if (afterUserCreated != null)
                {
                    afterUserCreated(user);
                }
                return confirmAction();
            }

            return invalidModelStateAction();
        }
        public ActionResult AddChild(RegistrationViewModel registrationViewModel)
        {
            var parent = userService.CurrentUser as Parent;
            if (parent == null)
            {
                //throw new TardisBankException("You must be a parent in order to register a Child");
                return StatusCode.NotFound;
            }

            return RegisterInternal(registrationViewModel, "Sorry, that user name has already been taken",
                pwd => parent.CreateChild(registrationViewModel.Name, registrationViewModel.Email, pwd),
                () => RedirectToAction("Index", "Child"), () => View("AddChild", registrationViewModel)
                );
        }
 public ActionResult Register(RegistrationViewModel registrationViewModel)
 {
     return RegisterInternal(registrationViewModel, "Sorry, that email address has already been registered.",
         pwd =>
             new Parent(registrationViewModel.Name, registrationViewModel.Email, pwd).Initialise(mediator),
         () => RedirectToAction("Confirm"), () => View("Register", registrationViewModel)
         );
 }