public async Task <MessagePage> Handle(MessagesQuery request, CancellationToken cancellationToken) { var count = await _dbContext.Set <ClientMessage>().CountAsync(cancellationToken); var messages = await _dbContext.Set <ClientMessage>().Skip((int)request.Offset).Take((int)request.Count).ToListAsync(cancellationToken); return(new MessagePage(messages.Select(m => new Message(m.Content, m.IpAddress, m.CreatedAt)), request.Offset, (ulong)count)); }
public async Task SaveMessages(MessageList messageList, CancellationToken cancellationToken) { var messageIds = messageList.Messages.Select(m => m.MessageId).ToList(); var existingMessages = await _dbContext.Set <ClientMessage>() .Where(cm => cm.ClientId == messageList.ClientId) .Where(cm => messageIds.Contains(cm.MessageId)) .ToListAsync(cancellationToken); var messageToAdd = messageList.Messages.Where(m => !existingMessages.Select(em => em.MessageId).ToList().Contains(m.MessageId)); // CLient id should be moved to separate table. await _dbContext.Set <ClientMessage>().AddRangeAsync(messageToAdd.Select( m => new ClientMessage { ClientId = messageList.ClientId, Content = m.Content, CreatedAt = m.CreatedAt, IpAddress = m.IpAddress, MessageId = m.MessageId, ReceivedAt = DateTimeOffset.Now }), cancellationToken); await _dbContext.SaveChangesAsync(cancellationToken); }