/// <summary> /// Adds a new Facebook User's Details to DataBase /// </summary> /// <param name="facebookUser">Facebook User's Details to add</param> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="InvalidOperationException"></exception> /// <returns>Returns -1 if operation is unsuccessful otherwise value greater than 0</returns> public ulong Add(FacebookUserDetail facebookUser) { if (facebookUser == null) throw new ArgumentNullException("facebookuser"); if (facebookUser.FacebookId == 0) throw new InvalidOperationException("To Add a Facebook User Detail the FBID of the User should be non zero"); if (Find(facebookUser.FacebookId) != null) return 0; using (var cn = new SqlConnection(DatabaseConnection.ConnectionStringToDb)) { using (var cmd = new SqlCommand("AddFacebookUser", cn)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@FACEBOOKID", SqlDbType.BigInt).Value = facebookUser.FacebookId; cmd.Parameters.Add("@OAUTHTOKEN", SqlDbType.VarChar, 300).Value = facebookUser.OAuthToken; cmd.Parameters.Add("@PROFILELINK", SqlDbType.VarChar, 50).Value = facebookUser.ProfileLink.AbsoluteUri; //cmd.Parameters.Add("@ALIVEFOR", SqlDbType.BigInt).Value = (long) Math.Floor(facebookUser.AliveFor.TotalSeconds); //This data seems to be inappropriate as AliveFor changes at the time of calculation cmd.Parameters.Add("@EXPIRESON", SqlDbType.DateTime).Value = facebookUser.ExpiresOn; cn.Open(); var res = cmd.ExecuteNonQuery(); return (ulong)res == 1UL ? facebookUser.FacebookId : 0; } } }
/// <summary> /// A constructor to Initialize a user with a given Restaurant Detail and Details for al base classes /// </summary> /// <param name="userid">The User's Id</param> /// <param name="name">The User's Name</param> /// <param name="userguid">The Unique id of the User</param> /// <param name="mobileNumber">The Mobile number of the user</param> /// <param name="loginexpireson">Login Expiry DateTime</param> /// <param name="role">The role ofthe user</param> /// <param name="address">The user's Address</param> /// <param name="emailid">The user's email id</param> /// <param name="password">The user's password as string (This has become obsolete and should not be used)</param> /// <param name="facebookdetail">The user's facebook detail</param> /// <param name="membershipuser">The membershipuser instance that will ba passed on to base class</param> public RestaurantUser(int userid, string name, Guid userguid, ulong mobileNumber, DateTime loginexpireson, RestaurantUserRole role, string address, string emailid, string password, FacebookUserDetail facebookdetail, MembershipUser membershipuser) : base(userid, name, userguid, mobileNumber, loginexpireson,role,membershipuser) { Address = address; EmailId = emailid; Password = password; FacebookDetail = facebookdetail; }
/// <summary> /// A constructor to Initialize a user with a given Restaurant Detail and Details for al base classes /// </summary> /// <param name="userid">The User's Id</param> /// <param name="name">The User's Name</param> /// <param name="userguid">The Unique id of the User</param> /// <param name="mobileNumber">The Mobile number of the user</param> /// <param name="loginexpireson">Login Expiry DateTime</param> /// <param name="role">The role ofthe user</param> /// <param name="address">The user's Address</param> /// <param name="emailid">The user's email id</param> /// <param name="password">The user's password as string (This has become obsolete and should not be used)</param> /// <param name="facebookdetail">The user's facebook detail</param> /// <param name="membershipuser">The membershipuser instance that will ba passed on to base class</param> public RestaurantUser(int userid, string name, Guid userguid, ulong mobileNumber, DateTime loginexpireson, RestaurantUserRole role, string address, string emailid, string password, FacebookUserDetail facebookdetail, MembershipUser membershipuser) : base(userid, name, userguid, mobileNumber, loginexpireson, role, membershipuser) { Address = address; EmailId = emailid; Password = password; FacebookDetail = facebookdetail; }
/// <summary> /// A Utility method to Get all the Facebook Users' Details from given SqlConnection and SqlCommand /// </summary> /// <param name="items">The Collection which will be updated with Read Rows</param> /// <param name="cn">The SqlConnection object to use for Database connection</param> /// <param name="cmd">The SqlCommand object that will be used to retrive data</param> protected static void GetAllRecord(IList<FacebookUserDetail> items, SqlConnection cn, SqlCommand cmd) { cn.Open(); using (var rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { while (rdr.Read()) { var item = new FacebookUserDetail { FacebookId = rdr.TryGetDataAsUInt64(0), OAuthToken = rdr.TryGetDataAsString(1), ProfileLink = rdr.TryGetDataAsString(2) == String.Empty ? null : new Uri(rdr.TryGetDataAsString(2)), ExpiresOn = rdr.TryGetDataAsDateTime(4) }; items.Add(item); } } }
// // GET: /OAuth/ public ActionResult Authorize(string state) { if (TempData.Peek(TempDataStringResuorce.FacebookStateData) != null && CryptographyHelper.MatchOneTimeHash(TempData[TempDataStringResuorce.FacebookStateData].ToString(), state)) { var query = new { Code = Request.QueryString["code"], Error = Request.QueryString["error"], ErrorReason = Request.QueryString["error_reason"], ErrorDescription = Request.QueryString["error_description"] }; if (query.Error != null && query.ErrorReason == "user_denied") { TempData[TempDataStringResuorce.ActionResultNotification] = new ActionResultNotification { Message = "It looks like you didn't Allowed us to Sign you in through Facebook, you can try again", Result = false, State = ActionResultNotification.MessageState.Error }; return RedirectToAction("LogIn", "Account"); } if (!query.Code.IsNullOrEmpty()) { var redirecturi = Url.AbsoluteAction("Authorize", "OAuth", null); var request = WebRequest.Create(FacebookHelper.GetAccessTokenUrl(AppConfigHelper.FacebookAppId, redirecturi, AppConfigHelper.FacebookAppSecret, query.Code)); try { var response = request.GetResponse(); var responsestream = response.GetResponseStream(); if (responsestream != null && response.ContentLength > 0) { var responsebody = new StreamReader(responsestream).ReadToEnd(); var token = new { AccessToken = responsebody.Split('&').First().Split('=').Last(), ExpiresOn = DateTime.UtcNow.AddSeconds(Convert.ToDouble(responsebody.Split('&').Last().Split('=').Last())) }; //Reuse varaibles to get User Details request = WebRequest.Create(FacebookHelper.GetFacebookNewUserUrl(token.AccessToken)); response = request.GetResponse(); responsestream = response.GetResponseStream(); if (responsestream != null) { responsebody = new StreamReader(responsestream).ReadToEnd(); var facebookuser = System.Web.Helpers.Json.Decode<FacebookUser>(responsebody); var facebookdetail = new FacebookUserDetail() { FacebookId = facebookuser.id, ExpiresOn = token.ExpiresOn, OAuthToken = token.AccessToken, ProfileLink = facebookuser.link }; //Try update with new facebookuser detail, if user dosent exist it will return false //Though Membership class returns a status of Duplicate user, for now I am going with it var restaurantuser = (RestaurantUser)null; if (!new FacebookUserDetailRepository().Update(facebookdetail)) { restaurantuser = new RestaurantUser(0, facebookuser.name, Guid.NewGuid()) { EmailId = facebookuser.email, FacebookDetail = facebookdetail, UserRole = UserBase.RestaurantUserRole.Customer }; MembershipCreateStatus createstatus; restaurantuser = MembershipService.CreateUser(restaurantuser, out createstatus); } if (restaurantuser == null) restaurantuser = MembershipService.GetUser(facebookdetail.FacebookId.ToString(), true); if (restaurantuser != null) { //If all goes well Log the user in FormsService.SignIn(restaurantuser, true); } } TempData[TempDataStringResuorce.ActionResultNotification] = new ActionResultNotification { Message = "You have been successully Logged in", Result = true, State = ActionResultNotification.MessageState.Information }; return RedirectToAction("Index", "Home"); } } catch (WebException exception) { return ProcessResponseErrorRedirect(redirecturi, exception); } } } return RedirectToAction("Index", "Home"); }