public IActionResult UpdateProfile(string updatedDisplayName, string updatedBio, int id)
        {
            var user = _db.Users.FirstOrDefault(u => u.Id == id);

            if (user == null)
            {
                return(RedirectToAction("Profile"));
            }

            var bio = _db.UserBios.FirstOrDefault(ub => ub.UserId == user.Id);

            if (bio == null)
            {
                updatedBio = "Bio of " + user.Username;
                var newBio = new UserBio
                {
                    Bio    = updatedBio,
                    UserId = user.Id
                };

                _db.UserBios.Add(newBio);
            }
            else
            {
                if (updatedBio != null)
                {
                    bio.Bio = updatedBio;
                }
                else
                {
                    bio.Bio = bio.Bio;
                }
            }

            if (updatedDisplayName != null)
            {
                user.DisplayName = updatedDisplayName;
            }
            else
            {
                user.DisplayName = user.DisplayName;
            }

            _db.SaveChanges();
            return(RedirectToAction("Profile"));
        }
        public IActionResult ProcessRegister(RegisterInputModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View("Register"));
            }

            var user = new User
            {
                Email        = model.Email,
                Username     = model.Username,
                Password     = model.Password,
                DisplayName  = model.DisplayName,
                RegisteredAt = DateTime.Now
            };

            var bio = new UserBio
            {
                UserId = user.Id,
                Bio    = user.DisplayName + "\'s bio" // default bio
            };

            var dbUserName  = _db.Users.SingleOrDefault(u => u.Username == user.Username);
            var dbUserEmail = _db.Users.SingleOrDefault(u => u.Email == user.Email);

            // adding custom model state errors
            if (dbUserName != null || dbUserEmail != null || user.Password != model.ConfirmPassword)
            {
                if (dbUserName != null)
                {
                    ModelState.AddModelError("Username", "Username already exists");
                }

                if (dbUserEmail != null)
                {
                    ModelState.AddModelError("Email", "Email already exists");
                }

                if (user.Password != model.ConfirmPassword)
                {
                    ModelState.AddModelError("Password", "Passwords do not match");
                }

                return(View("Register"));
            }

            user.Password = _passwordHasher.HashPassword(user.Password);

            _db.Users.Add(user);
            _db.UserBios.Add(bio);
            _db.SaveChanges();

            // unique Id for email verification
            var uniqueIdentifier = new UniqueIdentifiers
            {
                UserId     = user.Id,
                UniqueId   = Guid.NewGuid(),
                IsVerified = false
            };

            _db.UniqueIdentifiers.Add(uniqueIdentifier);
            _db.SaveChanges();

            const string from     = "*****@*****.**";
            const string fromName = "RecipeList";
            const string subject  = "RecipeList Confirmation Email";
            var          body     = "Click <a href='https://myrecipelist.azurewebsites.net/account/verify/" + user.Id + "/" +
                                    uniqueIdentifier.UniqueId + "'>Here</a> to confirm your email and gain access to the site!";

//            var body = "Click <a href='https://localhost:5001/account/verify/" + user.Id + "/" +
//                       uniqueIdentifier.UniqueId + "'>Here</a> to confirm your email and gain access to the site!";

            _emailSender.SendEmail(user.Email, user.Username, from, fromName, subject, body, true);
            return(RedirectToAction("AwaitingVerification"));
        }