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);
            }
예제 #2
0
    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);
        }
예제 #4
0
        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);
        }