Фикс чата

This commit is contained in:
Халимов Рустам
2026-03-20 01:40:02 +03:00
parent 473e9bcef6
commit f3e0941647
3 changed files with 54 additions and 19 deletions
@@ -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(