public TUser LoadUser <TUser>(HttpContextBase httpContext) where TUser : FacebookUser, new()
        {
            dynamic signedRequest = GetSignedRequest(httpContext);

            if (signedRequest != null)
            {
                string userId = signedRequest.user_id;
                if (userId == null)
                {
                    return(null);
                }

                var user = (TUser)facebookUserStorageService.GetUser(userId);
                if (user == null)
                {
                    user = new TUser()
                    {
                        FacebookId = userId
                    };
                }
                return(RefreshUser(user, signedRequest.oauth_token));
            }

            throw new ApplicationException("Invalid request. No signed_request parameter was found on the request.");
        }
        //TODO: (ErikPo) Make this async
        public HttpResponseMessage Post(JObject facebookObject)
        {
#if Debug
            Utilities.Log(facebookObject.ToString());
#endif
            //TODO: (ErikPo) Find out for sure if we need to validate the request here during the security review

            //TODO: (ErikPo) This code needs to move into some sort of user change handler
            if (facebookObject["object"].Value <string>() == "user")
            {
                foreach (var entry in facebookObject["entry"])
                {
                    var facebookId = entry["id"].Value <string>();
                    var fields     = new List <string>();
                    foreach (var changedField in entry["changed_fields"])
                    {
                        fields.Add(changedField.Value <string>());
                    }
                    if (fields.Count > 0)
                    {
                        var user = facebookUserStorageService.GetUser(facebookId);
                        if (user != null)
                        {
                            facebookService.RefreshUserFields(user, fields.ToArray());
                            FacebookUserEvents.FireUserChangedEvent(user);
                        }
                    }
                }
            }

            //TODO: (ErikPo) Parse other stuff like friend changes

            return(Request.CreateResponse(HttpStatusCode.OK));
        }
        private object GetUser(Type modelType, string facebookId, global::Facebook.FacebookClient client)
        {
            var user = facebookUserStorageService.GetUser(facebookId);

            //TODO: (ErikPo) Fill in the other half of this condition
            if (user == null /* or this is the first time the app has started */)
            {
                object userFields = client.Get("me" + (!String.IsNullOrEmpty(fields) ? "?fields=" + fields.Replace(" ", String.Empty) : facebookService.GetFields(modelType)));

                if (modelType == typeof(FacebookUser))
                {
                    return(new FacebookUser {
                        Data = userFields
                    });
                }
                else if (modelType == typeof(object))
                {
                    return((dynamic)userFields);
                }

                user      = (FacebookUser)Activator.CreateInstance(modelType);
                user.Data = userFields;

                var          facebookFields = GetUserFields(modelType);
                PropertyInfo userProperty;
                string       facebookFieldName;
                object       fieldValue;
                foreach (var field in facebookFields)
                {
                    if (field.Value != null && field.Value.Ignore)
                    {
                        continue;
                    }
                    userProperty      = field.Key;
                    facebookFieldName = field.Value != null ? field.Value.JsonField : String.Empty;
                    if (!String.IsNullOrEmpty(facebookFieldName))
                    {
                        fieldValue = GetFBFieldValue(userFields, facebookFieldName.Split('.'));
                    }
                    else
                    {
                        fieldValue = GetFBFieldValue(userFields, new[] { userProperty.Name });
                    }
                    if (fieldValue != null)
                    {
                        userProperty.SetValue(user, fieldValue, null);
                    }
                }

                facebookUserStorageService.AddUser(user);
            }

            return(user);
        }