예제 #1
0
        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));
        }
예제 #2
0
파일: Messenger.cs 프로젝트: TomeQ2k/_Smile
        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));
        }