public async Task <IActionResult> Feed() { var user = await _userManager.GetUserAsync(User); if (user == null) { throw new ApplicationException($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); } // Subscriptions must be explicitly loaded _appDbContext.Entry(user).Collection(x => x.Subs).Load(); // Load all global achievements _appDbContext.GlobalAchievements.ToList(); // Feed for the current user FeedViewModel model = new FeedViewModel() { CurrentUser = user, FeedItems = new List <FeedItem>() }; foreach (Subscription sub in user.Subs) // Get each user { ApplicationUser nextUser = _userManager.Users.Where(x => x.Id == sub.SubscribingToUserID).SingleOrDefault(); if (nextUser != null) // Only generate feed from valid users { FeedItem baseFI = new FeedItem(); baseFI.FromUser = nextUser; // See if their image URL is cached baseFI.ImageData = _imageCache.GetImageEmbed(nextUser.Id); if (baseFI.ImageData == null) // Image isn't cached yet { if (nextUser.ProfileImageURL == null) // Use Task-It logo { _imageCache.SetImage(_hostingEnvironment, nextUser.Id, GetBaseUrl() + "/images/logoattempt.png", true); baseFI.ImageData = _imageCache.GetImageEmbed(nextUser.Id); } else // Use profile image. If it fails, will fall back to task-it logo { _imageCache.SetImage(_hostingEnvironment, nextUser.Id, nextUser.ProfileImageURL, true); baseFI.ImageData = _imageCache.GetImageEmbed(nextUser.Id); } } // Create feed items for all public tasks, achievements, and posts within the last 7 days // Posts _appDbContext.Entry(nextUser).Collection(x => x.Posts).Load(); foreach (Post post in nextUser.Posts) { FeedItem postFI = new FeedItem(baseFI); if (post.PostedTime > DateTime.Now.AddDays(-7)) { // Add this to feed postFI.Occured = post.PostedTime; postFI.ItemType = FeedItemType.Post; postFI.Text = post.Text; postFI.Postid = post.PostID; model.FeedItems.Add(postFI); } } _appDbContext.Entry(nextUser).Collection(x => x.Achivements).Load(); foreach (UserAchievement ua in nextUser.Achivements) { FeedItem acFI = new FeedItem(baseFI); if (ua.AchievedTime > DateTime.Now.AddDays(-7)) { // Add this to feed acFI.Occured = (DateTime)ua.AchievedTime; acFI.ItemType = FeedItemType.Achievement; acFI.Text = ua.GlobalAchievement.Name; model.FeedItems.Add(acFI); } } _appDbContext.Entry(nextUser).Collection(x => x.Tasks).Load(); foreach (Models.Task task in nextUser.Tasks) { FeedItem taskFI = new FeedItem(baseFI); if (task.CreatedDate > DateTime.Now.AddDays(-7) && task.IsPrivate == false && task.ApplicationUserId != user.Id) { // Add this to feed taskFI.Occured = (DateTime)task.CreatedDate; taskFI.ItemType = FeedItemType.Task; taskFI.Text = task.Summary; taskFI.Taskid = task.ID; model.FeedItems.Add(taskFI); } } } } // Sort feed items by descending date. Quick, dirty, and effective (makes an extra copy in memory) // model = model.FeedItems.OrderBy(x => x.Occured).ToList(); model.FeedItems = model.FeedItems.OrderByDescending(x => x.Occured).ToList(); return(View(model)); }