/// <summary> /// Returns a raw feed of past feed items without any extra HTML chrome. Used for AJAX updates to an existing feed. /// </summary> /// <param name="id">The ID of the first feed item received by the client.</param> /// <returns></returns> public ActionResult OldFeedItems(int id, int count, int userId, int errorType = -1, string keyword = "", int hash = 0) { try { var query = new ActivityFeedQuery(); query.CommentFilter = hash == 0 ? keyword : "#" + keyword; if (errorType > 0) { query = new BuildErrorQuery(Db); (query as BuildErrorQuery).BuildErrorTypeId = errorType; } BuildBasicQuery(query); query.MaxLogId = id; query.MaxQuerySize = count; //used to build a feed for a single person. Useful for building profile-based feeds if (userId > 0) { query.ClearSubscriptionSubjects(); query.AddSubscriptionSubject(Db.Users.Where(u => u.Id == userId).FirstOrDefault()); } List <FeedItem> feedItems = query.Execute().ToList(); List <AggregateFeedItem> aggregateFeed = AggregateFeedItem.FromFeedItems(feedItems); //build the "you and 5 others got this error"-type messages FeedViewModel vm = new FeedViewModel(); BuildEventRelations(vm, feedItems); ViewBag.RecentUserErrors = vm.RecentUserErrors; ViewBag.RecentClassErrors = vm.RecentClassErrors; ViewBag.ErrorTypes = vm.ErrorTypes; return(View("AjaxFeed", aggregateFeed)); } catch (Exception ex) { LogErrorMessage(ex); return(RedirectToAction("FeedDown", "Error")); } }
/// <summary> /// /// </summary> /// <param name="id">The ID of the last event received by the user. Used for AJAX updates</param> /// <returns></returns> public ActionResult Index(long timestamp = -1, int errorType = -1, string errorTypeStr = "", string keyword = "", int hash = 0) { //turned off for now. //return RedirectToAction("FeedDown", "Error"); try { var query = new ActivityFeedQuery(); query.CommentFilter = hash == 0 ? keyword : "#" + keyword; //Two ways that we can receive an error type: by name (errorTypeStr) or by ID (errorType). //First, we check the string and see if we can match it to an ID number. Then, we check //to see if we have a valid ID number. If it doesn't work out, just work as normal. if (string.IsNullOrEmpty(errorTypeStr) == false) { errorTypeStr = errorTypeStr.ToLower().Trim(); ErrorType type = Db.ErrorTypes.Where(e => e.Name.CompareTo(errorTypeStr) == 0).FirstOrDefault(); if (type != null) { errorType = type.Id; } } if (errorType > 0) { query = new BuildErrorQuery(Db); (query as BuildErrorQuery).BuildErrorTypeId = errorType; } BuildBasicQuery(query); FeedViewModel vm = new FeedViewModel(); if (timestamp > 0) { DateTime pullDate = new DateTime(timestamp); query.StartDate = pullDate; } else { query.MaxQuerySize = 40; } //and finally, retrieve our list of feed items var maxIdQuery = Db.EventLogs.Select(l => l.Id); if (maxIdQuery.Count() > 0) { vm.LastLogId = maxIdQuery.Max(); } else { vm.LastLogId = 0; } List <FeedItem> feedItems = query.Execute().ToList(); List <AggregateFeedItem> aggregateFeed = AggregateFeedItem.FromFeedItems(feedItems); this.UpdateLogSubscriptions(CurrentUser); try { vm.LastPollDate = aggregateFeed.Select(a => a.MostRecentOccurance).Max(); } catch (Exception) { vm.LastPollDate = DateTime.MinValue.AddDays(2); } vm.Feed = aggregateFeed; vm.EventFilterOptions = ActivityFeedQuery.GetAllEvents().OrderBy(e => e.ToString()).ToList(); vm.UserEventFilterOptions = query.ActiveEvents; vm.ErrorTypes = Db.ErrorTypes.Distinct().ToList(); vm.SelectedErrorType = new ErrorType(); if (errorType > 0) { vm.SelectedErrorType = Db.ErrorTypes.Where(e => e.Id == errorType).FirstOrDefault(); if (vm.SelectedErrorType == null) { vm.SelectedErrorType = new ErrorType(); } } //build possible courses and user types vm.Courses = Db.Courses.ToList(); vm.CourseRoles.Add(CourseRole.Student); vm.CourseRoles.Add(CourseRole.Assistant); vm.CourseRoles.Add(CourseRole.Coordinator); if (_userSettings != null) { vm.SelectedCourseId = _userSettings.CourseFilter; vm.SelectedCourseRole = _userSettings.CourseRole; } //build the "you and 5 others got this error"-type messages BuildEventRelations(vm, feedItems); vm.Keyword = keyword; return(View(vm)); } catch (Exception ex) { LogErrorMessage(ex); return(RedirectToAction("FeedDown", "Error")); } }