/// <summary>
        /// Create new user in database
        /// </summary>
        /// <param name="nickName"></param>
        /// <param name="password"></param>
        /// <param name="email"></param>
        /// <returns></returns>
        internal DbOperationStatus <User> CreateNew(string nickName, string password, string email)
        {
            DbOperationStatus <User> status = new DbOperationStatus <User>();

            User newUser = new User()
            {
                Nickname          = nickName,
                Email             = email,
                ID                = new Guid(),
                IsOnline          = false,
                LastLoginDate     = DateTime.MinValue,
                RegistrationDate  = DateTime.Now,
                Verified          = false,
                VerificationToken = Guid.NewGuid()
            };

            using (var userPasswordCrypto = new UserPasswordCryptography(password))
            {
                var encryptionResult = userPasswordCrypto.EncryptUserPassword();
                newUser.Salt           = encryptionResult.Salt;
                newUser.HashedPassword = encryptionResult.HashedPassword;
            }

            var num = newUser.Salt.Count();

            _comparerDatabaseContext.Users.Add(newUser);

            status.RowsAffected     = _comparerDatabaseContext.SaveChanges();
            status.OperationSuccess = true;
            status.ReturnedObject   = newUser;

            return(status);
        }
 /// <summary>
 /// Using password cryprography checks password match
 /// </summary>
 /// <param name="user">User</param>
 /// <param name="plainPassword">Password entered by user</param>
 /// <returns>Password match status</returns>
 internal bool UserLoginPasswordMatch(User user, string plainPassword)
 {
     using (var userPassCrypto = new UserPasswordCryptography(plainPassword))
     {
         return(userPassCrypto.AuthenticateUserPassword(user));
     }
 }
        /// <summary>
        /// Set new password to the user
        /// </summary>
        /// <param name="userID">User ID</param>
        /// <param name="newPassword">Password selected by user</param>
        /// <returns></returns>
        internal DbOperationStatus <User> UpdatePassword(Guid userID, string newPassword)
        {
            DbOperationStatus <User> status = new DbOperationStatus <User>
            {
                QueryResult = _comparerDatabaseContext.Users.Where(u => u.ID.Equals(userID))
                              .SingleOrDefault()
            };

            if (status.QueryResult != null)
            {
                User user = status.QueryResult as User;

                using (var userPasswordCrypto = new UserPasswordCryptography(newPassword))
                {
                    var encryptionResult = userPasswordCrypto.EncryptUserPassword();
                    user.Salt           = encryptionResult.Salt;
                    user.HashedPassword = encryptionResult.HashedPassword;
                }

                status.RowsAffected     = _comparerDatabaseContext.SaveChanges();
                status.OperationSuccess = true;
            }
            else
            {
                _logger.LogError("Update user's password - no user has been found");
                status.OperationSuccess = false;
            }

            return(status);
        }