Фикс чата
This commit is contained in:
@@ -105,21 +105,35 @@ public sealed class MessageRepository : IMessageRepository
|
||||
public async Task AddReadReceiptsAsync(Guid userId, List<Guid> messageIds, CancellationToken cancellationToken)
|
||||
{
|
||||
var filter = Builders<Message>.Filter.In(m => m.Id, messageIds);
|
||||
|
||||
var messages = await _messages.Find(filter).ToListAsync(cancellationToken);
|
||||
if (!messages.Any()) return;
|
||||
|
||||
var chatId = messages.First().ChatId;
|
||||
var maxDate = messages.Max(m => m.CreatedAt);
|
||||
|
||||
var notReadFilter = Builders<Message>.Filter.Not(
|
||||
Builders<Message>.Filter.ElemMatch<ReadReceipt>(
|
||||
"ReadBy",
|
||||
Builders<ReadReceipt>.Filter.Eq(r => r.UserId, userId)
|
||||
)
|
||||
);
|
||||
|
||||
var finalFilter = Builders<Message>.Filter.And(
|
||||
Builders<Message>.Filter.Eq(m => m.ChatId, chatId),
|
||||
Builders<Message>.Filter.Ne(m => m.SenderId, userId),
|
||||
Builders<Message>.Filter.Lte(m => m.CreatedAt, maxDate),
|
||||
notReadFilter
|
||||
);
|
||||
|
||||
var unreadMessagesToMark = await _messages.Find(finalFilter).ToListAsync(cancellationToken);
|
||||
|
||||
var writes = new List<WriteModel<Message>>();
|
||||
foreach (var msg in messages)
|
||||
foreach (var msg in unreadMessagesToMark)
|
||||
{
|
||||
if (!msg.ReadBy.Any(r => r.UserId == userId))
|
||||
{
|
||||
var receipt = new ReadReceipt(msg.Id, userId);
|
||||
|
||||
var pushUpdate = Builders<Message>.Update.Push("ReadBy", receipt);
|
||||
|
||||
var updateModel = new UpdateOneModel<Message>(Builders<Message>.Filter.Eq(m => m.Id, msg.Id), pushUpdate);
|
||||
writes.Add(updateModel);
|
||||
}
|
||||
var receipt = new ReadReceipt(msg.Id, userId);
|
||||
var pushUpdate = Builders<Message>.Update.Push("ReadBy", receipt);
|
||||
var updateModel = new UpdateOneModel<Message>(Builders<Message>.Filter.Eq(m => m.Id, msg.Id), pushUpdate);
|
||||
writes.Add(updateModel);
|
||||
}
|
||||
|
||||
if (writes.Any())
|
||||
@@ -180,8 +194,10 @@ public sealed class MessageRepository : IMessageRepository
|
||||
public async Task<int> GetUnreadCountAsync(Guid chatId, Guid userId, CancellationToken cancellationToken)
|
||||
{
|
||||
var notReadFilter = Builders<Message>.Filter.Not(
|
||||
Builders<Message>.Filter.ElemMatch("ReadBy",
|
||||
Builders<BsonDocument>.Filter.Eq("UserId", userId))
|
||||
Builders<Message>.Filter.ElemMatch<ReadReceipt>(
|
||||
"ReadBy",
|
||||
Builders<ReadReceipt>.Filter.Eq(r => r.UserId, userId)
|
||||
)
|
||||
);
|
||||
|
||||
var finalFilter = Builders<Message>.Filter.And(
|
||||
|
||||
Reference in New Issue
Block a user