protected void Application_Start()
        {
            Database.SetInitializer(new EventPlannerContextInitializer());

            //Force the context to initialize on app start... comment this line out after the site starts up for the first time!
            using (var context = new EventPlannerContext())
            {
                context.Database.Initialize(true);
            }

            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
        }
        public ActionResult ConfigureInvitation(int eventId, int pendingInvitationId)
        {
            var userId = WebSecurity.GetUserId(User.Identity.Name);

            using (var context = new EventPlannerContext())
            {
                //Add an invitation for new user id
                var theEvent = context.Events.Include("Coordinator").FirstOrDefault(x => x.EventId == eventId);
                var theInvitedPerson = context.People.FirstOrDefault(x => x.PersonId == userId);
                theEvent.RegisteredInvites.Add(theInvitedPerson);

                //Make the responding person a friend of the event host
                theEvent.Coordinator.MyRegisteredFriends.Add(theInvitedPerson);

                //Make the host a friend of the responding person
                theInvitedPerson.MyRegisteredFriends.Add(theEvent.Coordinator);

                //Get rid of the pending registration id event association
                var theUnregisteredInvite =
                    context.PendingInvitations.FirstOrDefault(
                        x => x.PendingInvitationId == pendingInvitationId);

                theEvent.UnRegisteredInvites.Remove(theUnregisteredInvite);

                //Get rid of the pending registration friend association
                theEvent.Coordinator.MyUnRegisteredFriends.Remove(theUnregisteredInvite);

                //Get rid of the pending registration id
                context.PendingInvitations.Remove(theUnregisteredInvite);

                context.SaveChanges();
            }

            //Send then to the accept the invitation page.
            return RedirectToAction("AcceptInvitation", "Home", new { eventId = eventId, accepteeId = userId });
        }
        public ActionResult UpdateUserInfo(ManageNonPasswordViewModel model)
        {
            bool userExists = false;
            if (ModelState.IsValid)
            {
                using (var context = new EventPlannerContext())
                {
                    var updateMe = context.People.FirstOrDefault(x => x.PersonId == model.UserId);
                    if (updateMe != null)
                    {
                        updateMe.FirstName = model.FirstName;
                        updateMe.LastName = model.LastName;
                        updateMe.Email = model.Email;
                        updateMe.PhoneNumber = model.PhoneNumber;
                        context.SaveChanges();
                        userExists = true;
                    }
                }
                if (userExists)
                    return RedirectToAction("Manage", new { Message = ManageMessageId.UpdateUserInfoSuccess });
            }

            return RedirectToAction("Manage", new { Message = ManageMessageId.UpdateUserInfoFail });
        }
        //
        // GET: /Account/Manage
        public ActionResult Manage(ManageMessageId? message)
        {
            ViewBag.StatusMessage = GetMessageFromMessageId(message);
            ViewBag.HasLocalPassword = OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name));

            var userId = WebSecurity.GetUserId(User.Identity.Name);
            bool hasLocalAccount = OAuthWebSecurity.HasLocalAccount(userId);
            var model = new LocalPasswordViewModel();

            //Populate the user info stuff
            if (hasLocalAccount)
            {
                using (var context = new EventPlannerContext())
                {
                    var user = context.People.FirstOrDefault(x => x.PersonId == userId);
                    model.UserInfo = new ManageNonPasswordViewModel
                    {
                        UserId = user.PersonId,
                        FirstName = user.FirstName,
                        LastName = user.LastName,
                        PhoneNumber = user.PhoneNumber,
                        Email = user.Email
                    };
                }
            }

            ViewBag.ReturnUrl = Url.Action("Manage");
            return View(model);
        }
        public ActionResult ExternalLoginConfirmation(RegisterExternalLoginViewModel model, string returnUrl)
        {
            string provider = null;
            string providerUserId = null;

            if (User.Identity.IsAuthenticated || !OAuthWebSecurity.TryDeserializeProviderUserId(model.ExternalLoginData, out provider, out providerUserId))
            {
                return RedirectToAction("Manage");
            }

            if (ModelState.IsValid)
            {
                // Insert a new user into the database
                using (EventPlannerContext db = new EventPlannerContext())
                {
                    Person user = db.People.FirstOrDefault(u => u.UserName.ToLower() == model.UserName.ToLower());
                    // Check if user already exists
                    if (user == null)
                    {
                        // Insert name into the profile table
                        db.People.Add(new Person { UserName = model.UserName, NotifyWithEmail = true, Email = model.Email });
                        db.SaveChanges();

                        OAuthWebSecurity.CreateOrUpdateAccount(provider, providerUserId, model.UserName);
                        OAuthWebSecurity.Login(provider, providerUserId, createPersistentCookie: false);

                        return RedirectToLocal(returnUrl);
                    }
                    else
                    {
                        ModelState.AddModelError("UserName", "User name already exists. Please enter a different user name.");
                    }
                }
            }

            ViewBag.ProviderDisplayName = OAuthWebSecurity.GetOAuthClientData(provider).DisplayName;
            ViewBag.ReturnUrl = returnUrl;
            return View(model);
        }
        public ActionResult ExternalLoginCallback(string returnUrl)
        {
            AuthenticationResult result = OAuthWebSecurity.VerifyAuthentication(Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl }));
            if (!result.IsSuccessful)
            {
                return RedirectToAction("ExternalLoginFailure");
            }

            var token = result.ExtraData["accesstoken"];

            //Set the Access token returned
            using (var context = new EventPlannerContext())
            {
                var firstRow = context.FacebookAPIValues.FirstOrDefault(x => x.PersonId == WebSecurity.CurrentUserId);

                if (firstRow == null)
                    context.FacebookAPIValues.Add(new FacebookAPIValue { AccessToken = token, PersonId = WebSecurity.CurrentUserId });
                else
                    firstRow.AccessToken = token;

                context.SaveChanges();
            }

            if (OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false))
            {
                return RedirectToLocal(returnUrl);
            }

            if (User.Identity.IsAuthenticated)
            {
                // If the current user is logged in add the new account
                OAuthWebSecurity.CreateOrUpdateAccount(result.Provider, result.ProviderUserId, User.Identity.Name);
                return RedirectToLocal(returnUrl);
            }
            else
            {
                // User is new, ask for their desired membership name
                string loginData = OAuthWebSecurity.SerializeProviderUserId(result.Provider, result.ProviderUserId);
                ViewBag.ProviderDisplayName = OAuthWebSecurity.GetOAuthClientData(result.Provider).DisplayName;
                ViewBag.ReturnUrl = returnUrl;
                return View("ExternalLoginConfirmation", new RegisterExternalLoginViewModel { UserName = result.UserName, ExternalLoginData = loginData });
            }
        }