private int FindNumberOfUnreadMessages(ApplicationUser me, Group group) { // Find number of unread messages. LastGroupVisit lastVisit = me.LastGroupVisits .Where(x => x.GroupId == group.GroupId) .FirstOrDefault(); if (lastVisit == null) { return(group.Statuses.Count()); } else { return(group.Statuses .Where(x => x.DateCreatedUtc > lastVisit.VisitTimeUtc && !x.CreatorId.Equals(me.Id)) .Count()); } }
public async Task <IHttpActionResult> GetStatuses(int groupId, DateTime sinceWhen) { string userId = User.Identity.GetUserId(); ApplicationUser me = db.Users.Find(userId); Group group = await db.Groups.FindAsync(groupId); if (group == null) { return(BadRequest(string.Format("Group {0} doesn't exit.", groupId))); } if (!group.Members.Any(x => x.Id.Equals(userId))) { return(BadRequest("You're not in this group.")); } string myName = User.Identity.GetUserName(); var statuses = await db.Status .Where(s => s.GroupId == group.GroupId && s.DateCreatedUtc > sinceWhen) .Select(s => s) .OrderByDescending(s => s.DateCreatedUtc) .Take(QueryPageSize) .ToListAsync(); UIStatus[] uiStatuses = statuses.Select( s => new UIStatus() { Id = s.StatusId, CreatorName = s.Creator.Nickname, CreatorId = s.Creator.Id, DateCreatedUtc = s.DateCreatedUtc, DateCreatedLocal = s.DateCreatedLocal, DateModifiedUtc = s.DateModifiedUtc, DateModifiedLocal = s.DateModifiedLocal, Text = s.Text, IsRtl = ControllerUtils.IsRtl(s.Text), City = s.City, IsCreatedByUser = s.Creator.UserName.Equals(myName), Views = ControllerUtils.GetUIStatusViews(s.StatusViews) }).ToArray(); // Record group visit. LastGroupVisit lastVisit = me.LastGroupVisits.Where(x => x.GroupId == groupId).FirstOrDefault(); if (lastVisit == null) { db.LastGroupVisits.Add(new LastGroupVisit() { GroupId = groupId, Group = group, Visitor = me, VisitorId = me.Id, VisitTimeUtc = DateTime.UtcNow }); await db.SaveChangesAsync(); } else { lastVisit.VisitTimeUtc = DateTime.UtcNow; db.LastGroupVisits.Attach(lastVisit); db.Entry(lastVisit).Property(x => x.VisitTimeUtc).IsModified = true; await db.SaveChangesAsync(); } return(Ok(uiStatuses)); }