public ShopgunMembershipWebserviceGateway CreateUser(string username, string password, string email)
        {
            ShopgunMembershipWebserviceGateway response = new ShopgunMembershipWebserviceGateway();

            User newUser = new User
            {
                UserName                = username,
                Password                = password,
                Email                   = email,
                CreationDate            = DateTime.Now,
                LastActivity            = DateTime.Now,
                LastLockedOutDate       = DateTime.Now,
                LastLoginDate           = DateTime.Now,
                LastPasswordChangedDate = DateTime.Now
            };

            //TODO: Shall support language, translate from resource string.

            //Refactoring here please, extract to a method: ValidateNewUserInfo(string username, string password, string email) : bool
            if ((newUser.UserName == null) || (newUser.Password == null))
            {
                response.value   = false;
                response.message = "Enter username and password!";
                return(response);
            }
            if (_membershipProviderApplicationService.GetUser(newUser.UserName, false, ProviderName) != null)
            {
                response.value   = false;
                response.message = "Username already exists!";
                return(response);
            }
            if (_membershipProviderApplicationService.GetUserByMail(newUser.Email, ProviderName) != null)
            {
                response.value   = false;
                response.message = "Email already exists!";
                return(response);
            }
            //End of refactoring

            try
            {
                _membershipProviderApplicationService.CreateUser(newUser);
                response = ValidateMobileUser(newUser.UserName, password);
                if (response.value)
                {
                    response.message = "User created!";
                }
                return(response);
            }
            catch
            {
                response.value   = false;
                response.message = "User not created, system error!";
                return(response);
            }
        }
        public ShopgunMembershipWebserviceGateway ValidateMobileUser(string username, string password)
        {
            ShopgunMembershipWebserviceGateway response = new ShopgunMembershipWebserviceGateway
            {
                value = _membershipProviderApplicationService.ValidateMobileUser(username, password)
            };

            //TODO: Shall support language, translate from resource string.
            response.message = response.value == false ? "Username or password is wrong!" : "Login successful!";

            if (response.value)
            {
                response.token = _membershipProviderApplicationService.GenerateToken();
                _membershipProviderApplicationService.AddTokenToCache(response.token, username);
            }


            return(response);
        }
        public ShopgunMembershipWebserviceGateway ValidateGoogleUser()
        {
            var parameters = System.ServiceModel.Web.WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters;

            if (parameters.AllKeys.Contains("authToken"))
            {
                var authToken = parameters["authToken"];
                var url       = "https://www.googleapis.com/userinfo/v2/me";

                var request = (HttpWebRequest)WebRequest.Create(url);
                request.Headers.Add("Authorization", "Bearer " + authToken);

                var response  = (HttpWebResponse)request.GetResponse();
                var resStream = response.GetResponseStream();

                var googleUser     = Activator.CreateInstance <GoogleUser>();
                var jsonSerializer = new DataContractJsonSerializer(googleUser.GetType());

                var result = new ShopgunMembershipWebserviceGateway();
                if (resStream != null)
                {
                    googleUser = (GoogleUser)jsonSerializer.ReadObject(resStream);
                    resStream.Close();

                    if (googleUser == null)
                    {
                        result.value   = false;
                        result.message = "Could not retrieve user info from Google!";
                    }

                    var user = _membershipProviderApplicationService.GetUserByMail(googleUser.email, ProviderName);

                    if (user != null)
                    {
                        result.value   = true;
                        result.message = "Login successful!";
                    }
                    else
                    {
                        user = _membershipProviderApplicationService.CreateUser(new User
                        {
                            UserName  = googleUser.email,
                            FirstName = googleUser.given_name,
                            LastName  = googleUser.family_name,
                            Email     = googleUser.email,
                            Password  = ""
                        });
                        result.value   = true;
                        result.message = "User created!";
                    }
                    if (result.value)
                    {
                        result.token = _membershipProviderApplicationService.GenerateToken();
                        _membershipProviderApplicationService.AddTokenToCache(result.token, user.UserName);
                    }
                    return(result);
                }
            }
            System.ServiceModel.Web.WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
            return(null);
        }