public async Task <ActionResult> GetMessages(string withId, [FromQuery] PagingParameters parameters) { User user = await AuthenticateUser(); int toId = await Get <GetAdminOrUserIdQuery>().Execute(withId); GetMessagesDto request = new GetMessagesDto() { From = user.Id, To = toId, Parameters = parameters }; PagedResponse <MessageDto> messages = await Get <GetMessagesQuery>().Execute(request); return(Json(messages)); }
protected async override Task <PagedResponse <MessageDto> > DoExecute(GetMessagesDto request) { if (request.Parameters.Page < 1) { request.Parameters.Page = 1; } var queriedMessages = _dbContext.Messages.Where(m => m.FromId == request.From && m.ToId == request.To || m.ToId == request.From && m.FromId == request.To); var messagesTask = queriedMessages.OrderByDescending(m => m.Timestamp) .Skip((request.Parameters.Page - 1) * request.Parameters.PageSize) .Take(request.Parameters.PageSize) .ToListAsync(); var countTask = queriedMessages.CountAsync(); await Task.WhenAll(messagesTask, countTask); List <Message> messages = messagesTask.Result; int count = countTask.Result; // Set received messages as read await _setQueriedMessagesAsReadCommand.Execute(messages.Where(m => request.From == m.ToId && !m.IsRead)); PagedResponse <MessageDto> response = new PagedResponse <MessageDto>() { Page = request.Parameters.Page, TotalCount = count, Data = messages.Select(m => new MessageDto() { IsMine = m.FromId == request.From, Message = m.Text, Timestamp = m.Timestamp }) }; return(response); }