public static ProfileListViewModel CreateViewModel(UserProfile user)
        {
            var profileListViewModel = new ProfileListViewModel();
            profileListViewModel.Name = string.Format("{0} {1}", user.FirstName, user.LastName);
            profileListViewModel.Id = user.UserId;

            return profileListViewModel;
        }
        public static ProfileConnectionViewModel CreateViewModel(UserProfile user)
        {
            var model = new ProfileConnectionViewModel();

            model.Id = user.UserId;
            model.Name = string.Format("{0} {1}", user.FirstName, user.LastName);
            model.Email = user.Email;

            return model;
        }
        public static ProfileViewModel CreateViewModel(UserProfile user, bool isIndex = false)
        {
            var model = new ProfileViewModel();

            model.Id = user.UserId;
            model.Name = string.Format("{0} {1}", user.FirstName, user.LastName);
            model.Email = user.Email;
            model.Skills = new List<SkillViewModel>();
            model.Jobs = new List<JobViewModel>();
            model.Educations = new List<EducationViewModel>();
            model.APIKey = user.APIKey;

            if (isIndex)
            {
                if (user.SkillVisibility == VisibilityState.Public)
                {
                    model.Skills = user.Skills.Select(s => SkillViewModel.CreateViewModel(s));
                }

                if (user.JobsVisibility == VisibilityState.Public)
                {
                    model.Jobs = user.Jobs.Select(j => JobViewModel.CreateViewModel(j));
                }

                if (user.EducationVisibility == VisibilityState.Public)
                {
                    model.Educations = user.Education.Select(e => EducationViewModel.CreateViewModel(e));
                }
            }
            else
            {
                model.APIKey = string.Empty;
            }

            model.Connections = user.Followers
                .Where(e => e.Visibility == VisibilityState.Public)
                .Select(e => ProfileConnectionViewModel.CreateViewModel(e));

            model.Requests = user.Requests.Select(r => new ProfileViewModel()
            {
                Name = r.FromUserName,
                Id = r.FromUserId
            });

            return model;
        }
        public static ProfileApiViewModel CreateViewModel(UserProfile user, bool isIndex = false)
        {
            var apiViewModel = new ProfileApiViewModel();

            var jsonSerializer = new JavaScriptSerializer();
            apiViewModel.Name = string.Format("{0} {1}", user.FirstName, user.LastName);
            apiViewModel.Email = user.Email;
            apiViewModel.Skills = jsonSerializer.Serialize(
                user.Skills
                .Select(s => new
                {
                    Name = s.Name
                }));

            apiViewModel.Jobs = jsonSerializer.Serialize(user.Jobs
                .Select(j => new
                {
                    Employer = j.Employer,
                    Position = j.Position,
                    Description = j.Description,
                    StartDate = j.StartDate.ToString(),
                    EndDate = j.EndDate.ToString()
                }));

            apiViewModel.Educations = jsonSerializer.Serialize(user.Education
                .Select(e => new
                {
                    Institution = e.Institution,
                    Specialty = e.Specialty,
                    Description = e.Description,
                    StartDate = e.StartDate.ToString(),
                    EndDate = e.EndDate.ToString()
                }));

            apiViewModel.Connections = jsonSerializer.Serialize(user.Followers
                .Where(e => e.Visibility == VisibilityState.Public)
                .Select(e => new
                {
                    Name = String.Format("{0} {1}", e.FirstName, e.LastName),
                }));

            return apiViewModel;
        }
        public ActionResult Edit(UserProfile user)
        {
            if (user.UserId == WebSecurity.CurrentUserId && user.UserName.ToLower() == WebSecurity.CurrentUserName)
            {
                if (ModelState.IsValid)
                {
                    db.Entry(user).State = System.Data.EntityState.Modified;
                    db.SaveChanges();
                    return RedirectToAction("Index", "Account");
                }
            }

            return View(user);
        }
        private void MakeConnectState(UserProfile viewedUser, UserProfile currentUser, ProfileViewModel viewModel)
        {
            if (currentUser != null)
            {
                if (currentUser.UserId == viewedUser.UserId)
                {
                    viewModel.CanConnect = false;
                }
                else
                {
                    // check if the users are connected
                    if (currentUser.Following.Contains(viewedUser))
                    {
                        viewModel.Skills = viewModel.Skills.Select(s =>
                        {
                            if (!s.Endorsements.Where(u => u.Id == currentUser.UserId).Any())
                            {
                                s.CanBeEndorsed = true;
                            }
                            else
                            {
                                s.AlreadyEndorsed = true;
                            }

                            return s;
                        });
                    }
                    else
                    {
                        // check if connection hasn't already been requested
                        if (!db.Requests.Where(r =>
                            (r.FromUserId == currentUser.UserId && r.UserId == viewedUser.UserId) ||
                            (r.FromUserId == viewedUser.UserId && r.UserId == currentUser.UserId)
                            ).Any())
                        {
                            viewModel.CanConnect = true;
                        }
                    }
                }
            }
        }