public Result <bool> ChangePassword(int userId, UserPasswordViewModel password)
        {
            try
            {
                if (password.NewPassword != password.RepeatedNewPassword)
                {
                    throw new Exception(EResultMessage.InvalidData.ToString());
                }

                var user = Get(u => u.Id == userId);
                if (user == null)
                {
                    throw new Exception(EResultMessage.NotFound.ToString());
                }

                if (!Protected.Validate(password.OldPassword, user.HashPassword))
                {
                    throw new Exception(EResultMessage.WrongPassword.ToString());
                }

                user.HashPassword = Protected.CreatePasswordHash(password.NewPassword);
                Update(user);

                if (!SaveChanges())
                {
                    throw new Exception(EResultMessage.DatabaseError.ToString());
                }

                return(ResultHelper.Succeeded(true, message: EResultMessage.RegistrationDone.ToString()));
            }
            catch (Exception e)
            {
                return(ResultHelper.Failed <bool>(message: e.Message));
            }
        }
        public async Task <Result <bool> > AddUser(RegisterationViewModel userViewModel)
        {
            try
            {
                var user = new UserEntity {
                    Name        = userViewModel.Name,
                    Email       = userViewModel.Email,
                    PhoneNumber = userViewModel.PhoneNumber,
                    Address     = userViewModel.Address,
                    Type        = userViewModel.Type,
                    Picture     = userViewModel.Picture,
                    Gender      = userViewModel.Gender,
                };

                // Check for Type
                if (!Enum.IsDefined(typeof(EUserType), userViewModel.Type))
                {
                    throw new Exception(EResultMessage.NotUserType.ToString());
                }

                // Add user Typr
                user.Type = userViewModel.Type;

                if (userViewModel.Password != userViewModel.RepeatPassword)
                {
                    throw new Exception(EResultMessage.PasswordNotMatched.ToString());
                }

                // Hash user password
                user.HashPassword = Protected.CreatePasswordHash(userViewModel.Password);

                // Add user
                var result = Add(user);

                if (result == null)
                {
                    throw new Exception(EResultMessage.DatabaseError.ToString());
                }

                SaveChanges();

                var token = _tokenManager.GenerateUserToken(result).Token;

                var confirmLink = string.Format("{0}/api/user/confirm-account", _requestAttributes.AppBaseUrl);

                string body = File.ReadAllText("wwwroot/html/registartion.html");
                body = body.Replace("{link-path}", confirmLink);
                body = body.Replace("{user-name}", user.Name);
                body = body.Replace("{user-id}", user.Id.ToString());
                body = body.Replace("{user-token}", token);


                await _mailProvider.SendAsync(new MailMessageViewModel
                {
                    From       = MailProvider.SMTP_USER,
                    To         = user.Email,
                    IsBodyHtml = true,
                    Body       = body,
                    Subject    = "Confirm your account on Got It"
                });

                return(ResultHelper.Succeeded(true, message: EResultMessage.RegistrationDone.ToString()));
            }
            catch (DuplicateDataException)
            {
                return(ResultHelper.Failed(data: false, message: EResultMessage.EmailExists.ToString()));
            }
            catch (Exception e)
            {
                return(ResultHelper.Failed <bool>(message: e.Message));
            }
        }