public static TopicViewModel CreateTopicViewModel(Topic topic, PermissionSet permission, List <Post> posts, Post starterPost, int?pageIndex, int?totalCount, int?totalPages, MembershipUser loggedOnUser, Settings settings, ITopicNotificationService topicNotificationService, IPollAnswerService pollAnswerService, IVoteService voteService, IFavouriteService favouriteService, bool getExtendedData = false) { var userIsAuthenticated = loggedOnUser != null; // Check for online status var date = DateTime.UtcNow.AddMinutes(-AppConstants.TimeSpanInMinutesToShowMembers); var viewModel = new TopicViewModel { Permissions = permission, Topic = topic, Views = topic.Views, DisablePosting = loggedOnUser != null && loggedOnUser.DisablePosting == true, PageIndex = pageIndex, TotalCount = totalCount, TotalPages = totalPages, LastPostPermaLink = string.Concat(topic.NiceUrl, "?", AppConstants.PostOrderBy, "=", AppConstants.AllPosts, "#comment-", topic.LastPost.Id), MemberIsOnline = topic.User.LastActivityDate > date }; if (starterPost == null) { starterPost = posts.FirstOrDefault(x => x.IsTopicStarter); } // Get votes for all posts var postIds = posts.Select(x => x.Id).ToList(); postIds.Add(starterPost.Id); // Get all votes by post var votes = voteService.GetVotesByPosts(postIds); // Get all favourites for this user var allFavourites = favouriteService.GetByTopic(topic.Id); // Map the votes var startPostVotes = votes.Where(x => x.Post.Id == starterPost.Id).ToList(); var startPostFavs = allFavourites.Where(x => x.Post.Id == starterPost.Id).ToList(); // Create the starter post viewmodel viewModel.StarterPost = CreatePostViewModel(starterPost, startPostVotes, permission, topic, loggedOnUser, settings, startPostFavs); // Map data from the starter post viewmodel viewModel.VotesUp = startPostVotes.Count(x => x.Amount > 0); viewModel.VotesDown = startPostVotes.Count(x => x.Amount < 0); viewModel.Answers = totalCount != null ? (int)totalCount : posts.Count() - 1; // Create the ALL POSTS view models viewModel.Posts = CreatePostViewModels(posts, votes, permission, topic, loggedOnUser, settings, allFavourites); // ########### Full topic need everything if (getExtendedData) { // See if the user has subscribed to this topic or not var isSubscribed = userIsAuthenticated && topicNotificationService.GetByUserAndTopic(loggedOnUser, topic).Any(); viewModel.IsSubscribed = isSubscribed; // See if the topic has a poll, and if so see if this user viewing has already voted if (topic.Poll != null) { // There is a poll and a user // see if the user has voted or not viewModel.Poll = new PollViewModel { Poll = topic.Poll, UserAllowedToVote = permission[SiteConstants.Instance.PermissionVoteInPolls].IsTicked }; var answers = pollAnswerService.GetAllPollAnswersByPoll(topic.Poll); if (answers.Any()) { var pollvotes = answers.SelectMany(x => x.PollVotes).ToList(); if (userIsAuthenticated) { viewModel.Poll.UserHasAlreadyVoted = pollvotes.Count(x => x.User.Id == loggedOnUser.Id) > 0; } viewModel.Poll.TotalVotesInPoll = pollvotes.Count(); } } } return(viewModel); }