Esempio n. 1
0
        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));
        }