public async Task <IEnumerable <ChatMessageResource> > Handle(GetMessagesWithRecipientQuery request, CancellationToken cancellationToken = default) { int currentUserId = _userProvider.GetCurrentUserId(); MessageBoundaries boundaries = _mapper.Map <GetMessagesWithRecipientQuery, MessageBoundaries>(request); IEnumerable <ChatMessageResource> messages = await _unitOfWork.MessageRecipients .GetMessagesWithRecipient(currentUserId, request.RecipientId, boundaries) .Select(source => new ChatMessageResource { MessageRecipientId = source.MessageRecipientId, MessageId = source.MessageId, AuthorName = source.Message.Author.UserName, HtmlContent = source.Message.HtmlContent, Created = source.Message.Created, IsOwnMessage = source.Message.AuthorId == currentUserId, IsRead = source.Message.MessageRecipients.All(mr => mr.IsRead), }) .ToListAsync(cancellationToken); return(messages); }
public async Task GetMessagesWithRecipient_ShouldLimitTheAmountOfLoadedMessages_FromBottomUpwards() { // Arrange const int userId = 1; const int recipientId = 2; // Define a limit MessageBoundaries boundaries = new MessageBoundaries { Limit = 1, }; IEnumerable <User> users = new[] { new User { UserId = 1, Email = "*****@*****.**", UserName = "******", PasswordHash = Array.Empty <byte>(), PasswordSalt = Array.Empty <byte>() }, new User { UserId = 2, Email = "*****@*****.**", UserName = "******", PasswordHash = Array.Empty <byte>(), PasswordSalt = Array.Empty <byte>() }, }; IEnumerable <GroupMembership> groupMemberships = new[] { new GroupMembership { GroupMembershipId = 1, UserId = 1 }, new GroupMembership { GroupMembershipId = 2, UserId = 2 } }; IEnumerable <Recipient> recipients = new[] { new Recipient { RecipientId = 1, UserId = 1, }, new Recipient { RecipientId = 2, GroupMembershipId = 1 }, new Recipient { RecipientId = 3, UserId = 2, }, new Recipient { RecipientId = 4, GroupMembershipId = 2, }, }; IEnumerable <Message> messages = new[] { new Message { MessageId = 1, AuthorId = 1, Created = new DateTime(2020, 1, 1, 15, 0, 0), HtmlContent = "<p>Hello Group</p>", }, new Message { MessageId = 2, AuthorId = 2, Created = new DateTime(2020, 1, 1, 15, 5, 0), HtmlContent = "<p>Hello Group</p>", }, }; IEnumerable <MessageRecipient> messageRecipients = new[] { new MessageRecipient { MessageRecipientId = 1, RecipientId = 2, MessageId = 1 }, new MessageRecipient { MessageRecipientId = 2, RecipientId = 4, MessageId = 1 }, new MessageRecipient { MessageRecipientId = 3, RecipientId = 2, MessageId = 2 }, new MessageRecipient { MessageRecipientId = 4, RecipientId = 4, MessageId = 2 }, }; await _context.Users.AddRangeAsync(users); await _context.GroupMemberships.AddRangeAsync(groupMemberships); await _context.Recipients.AddRangeAsync(recipients); await _context.Messages.AddRangeAsync(messages); await _context.MessageRecipients.AddRangeAsync(messageRecipients); await _context.SaveChangesAsync(); IMessageRecipientRepository repository = new MessageRecipientRepository(_context); // Act IEnumerable <MessageRecipient> result = await repository.GetMessagesWithRecipient(userId, recipientId, boundaries); // Assert Assert.NotEmpty(result); Assert.Single(result); Assert.Equal(3, result.ElementAt(0).MessageRecipientId); }
public async Task GetMessagesWithRecipient_ShouldIncludeMessages_AfterADate() { // Arrange const int userId = 1; const int recipientId = 1; MessageBoundaries boundaries = new MessageBoundaries { Limit = 50, After = new DateTime(2020, 1, 1, 15, 3, 0), }; IEnumerable <MessageRecipient> databaseMessageRecipients = new[] { // User is author of message to recipient 1 new MessageRecipient { MessageRecipientId = 1, RecipientId = 1, Message = new Message { MessageId = 1, AuthorId = 1, Created = new DateTime(2020, 1, 1, 15, 0, 0), Author = new User { Recipient = new Recipient { RecipientId = 1 } } }, Recipient = new Recipient { GroupMembership = new GroupMembership { Recipient = new Recipient { RecipientId = 2 } } } }, new MessageRecipient { MessageRecipientId = 2, RecipientId = 2, Message = new Message { MessageId = 2, AuthorId = 1, Created = new DateTime(2020, 1, 1, 15, 5, 0), Author = new User { Recipient = new Recipient { RecipientId = 2 } } }, Recipient = new Recipient { GroupMembership = new GroupMembership { Recipient = new Recipient { RecipientId = 2 } } } }, new MessageRecipient { MessageRecipientId = 3, RecipientId = 1, Message = new Message { MessageId = 3, AuthorId = 2, Created = new DateTime(2020, 1, 1, 15, 6, 0), Author = new User { Recipient = new Recipient { RecipientId = 1 } } }, Recipient = new Recipient { GroupMembership = new GroupMembership { Recipient = new Recipient { RecipientId = 2 } } } }, // User is author of message to recipient 1 new MessageRecipient { MessageRecipientId = 4, RecipientId = 1, Message = new Message { MessageId = 4, AuthorId = 1, Created = new DateTime(2020, 1, 1, 15, 6, 40), Author = new User { Recipient = new Recipient { RecipientId = 1 } } }, Recipient = new Recipient { GroupMembership = new GroupMembership { Recipient = new Recipient { RecipientId = 2 } } } }, }; DbSet <MessageRecipient> dbSetMock = databaseMessageRecipients .AsQueryable() .BuildMockDbSet() .Object; _contextMock .Setup(m => m.MessageRecipients) .Returns(dbSetMock); MessageRecipientRepository repository = new MessageRecipientRepository(_contextMock.Object); // Act IEnumerable <MessageRecipient> result = await repository .GetMessagesWithRecipient(userId, recipientId, boundaries) .ToListAsync(); // Assert Assert.NotEmpty(result); Assert.Single(result); Assert.Equal(4, result.ElementAt(0).MessageRecipientId); }
public IQueryable <MessageRecipient> GetMessagesWithRecipient(int userId, int recipientId, MessageBoundaries boundaries) { IQueryable <MessageRecipient> messages = Context.MessageRecipients .AsNoTracking() .Where(mr => (boundaries.Before == null || mr.Message.Created < boundaries.Before) && (boundaries.After == null || mr.Message.Created > boundaries.After) ) .Where(mr => mr.RecipientId == recipientId && mr.Message.AuthorId == userId || mr.Recipient.GroupMembership.Recipient.RecipientId == recipientId || mr.Recipient.UserId == userId && mr.Message.Author.Recipient.RecipientId == recipientId ) .OrderBy(mr => mr.Message.Created); // Limit messages from bottom up if (boundaries.Limit != null) { return(messages .OrderByDescending(mr => mr.Message.Created) .Take((int)boundaries.Limit) .OrderBy(mr => mr.Message.Created)); } return(messages); }
public async Task GetMessagesWithRecipient_ShouldIncludeMessage_WhenUserIsRecipientOfGroupMessage() { // Arrange const int userId = 1; const int recipientId = 1; MessageBoundaries boundaries = new MessageBoundaries(); IEnumerable <MessageRecipient> databaseMessageRecipients = new[] { // User is recipient of message from recipient 1 (included) new MessageRecipient { MessageRecipientId = 1, RecipientId = 1, Message = new Message { MessageId = 1, AuthorId = 2, Created = new DateTime(2020, 1, 1), Author = new User { Recipient = new Recipient { RecipientId = 1 } } }, Recipient = new Recipient { GroupMembership = new GroupMembership { Recipient = new Recipient { RecipientId = 1 } } } }, // User is recipient of message from recipient 3 (not included) new MessageRecipient { MessageRecipientId = 2, RecipientId = 3, Message = new Message { MessageId = 2, AuthorId = 3, Created = new DateTime(2020, 1, 2), Author = new User { Recipient = new Recipient { RecipientId = 3 } } }, Recipient = new Recipient { GroupMembership = new GroupMembership { Recipient = new Recipient { RecipientId = 3 } } } }, // Different user is recipient of message from recipient 1 (not included) new MessageRecipient { MessageRecipientId = 3, RecipientId = 2, Message = new Message { MessageId = 3, AuthorId = 2, Created = new DateTime(2020, 1, 3), Author = new User { Recipient = new Recipient { RecipientId = 1 } } }, Recipient = new Recipient { GroupMembership = new GroupMembership { Recipient = new Recipient { RecipientId = 2 } } } }, // User is recipient of message from recipient 1 new MessageRecipient { MessageRecipientId = 4, RecipientId = 1, Message = new Message { MessageId = 4, AuthorId = 2, Created = new DateTime(2020, 1, 4), Author = new User { Recipient = new Recipient { RecipientId = 1 } } }, Recipient = new Recipient { GroupMembership = new GroupMembership { Recipient = new Recipient { RecipientId = 1 } } } }, }; DbSet <MessageRecipient> dbSetMock = databaseMessageRecipients .AsQueryable() .BuildMockDbSet() .Object; _contextMock .Setup(m => m.MessageRecipients) .Returns(dbSetMock); MessageRecipientRepository repository = new MessageRecipientRepository(_contextMock.Object); // Act IEnumerable <MessageRecipient> result = await repository .GetMessagesWithRecipient(userId, recipientId, boundaries) .ToListAsync(); // Assert Assert.NotEmpty(result); Assert.Equal(2, result.Count()); Assert.Equal(1, result.ElementAt(0).MessageRecipientId); Assert.Equal(4, result.ElementAt(1).MessageRecipientId); }