public async Task <IActionResult> GetConversations([FromQuery] GetConversationsPaginationRequest request) { var response = await mediator.Send(request); logger.LogResponse($"User #{HttpContext.GetCurrentUserId()} filtered their conversations", response.Error); return(this.CreateResponse(response)); }
public async Task <PagedList <Conversation> > GetConversations(GetConversationsPaginationRequest paginationRequest) { var sender = await profileService.GetCurrentUser(); var senderFriends = sender.FriendsSent.Concat(sender.FriendsReceived); var conversations = sender.MessagesSent.Concat(sender.MessagesReceived) .Where(m => string.IsNullOrEmpty(paginationRequest.Username) ? true : (m.SenderId == sender.Id ? m.Recipient.Username.ToLower().Contains(paginationRequest.Username.ToLower()) : m.Sender.Username.ToLower().Contains(paginationRequest.Username.ToLower()))) .OrderByDescending(m => m.DateSent) .GroupBy(m => new { m.SenderId, m.RecipientId }) .Select(g => { var message = g.First(); var conversation = new ConversationBuilder() .SentBy(message.SenderId) .SentTo(message.RecipientId) .SetLastMessage(new LastMessageBuilder() .SetText(message.Text) .SentBy(message.SenderId, message.Sender.Username, message.Sender.PhotoUrl) .Sent(message.DateSent) .MarkAsRead(message.IsRead) .Build()) .SetUserData(sender.Id == message.SenderId ? message.Recipient.Username : message.Sender.Username, sender.Id == message.SenderId ? message.Recipient.PhotoUrl : message.Sender.PhotoUrl) .Build(); return(conversation); }) .Where(c => senderFriends.Any(f => (f.SenderAccepted && f.RecipientAccepted) && (f.SenderId == c.SenderId || f.SenderId == c.RecipientId) && (f.RecipientId == c.SenderId || f.RecipientId == c.RecipientId))) .ToList(); var uniqueConversations = new List <Conversation>(); conversations.ForEach(c => { if (uniqueConversations.Count == 0 || !uniqueConversations.Any(uc => (uc.SenderId == c.SenderId && uc.RecipientId == c.RecipientId) || (uc.SenderId == c.RecipientId && uc.RecipientId == c.SenderId))) { uniqueConversations.Add(c); } }); return(uniqueConversations.ToPagedList <Conversation>(paginationRequest.PageNumber, paginationRequest.PageSize)); }