♻️ Some optimzations for sync message endpoint

This commit is contained in:
2025-08-25 19:24:42 +08:00
parent f2052410c7
commit 4ff89173b2

View File

@@ -281,7 +281,8 @@ public partial class ChatService(
Data = GrpcTypeHelper.ConvertObjectToByteString(message), Data = GrpcTypeHelper.ConvertObjectToByteString(message),
}, },
}; };
request.UserIds.AddRange(members.Select(a => a.Account).Where(a => a is not null).Select(a => a!.Id.ToString())); request.UserIds.AddRange(members.Select(a => a.Account).Where(a => a is not null)
.Select(a => a!.Id.ToString()));
await scopedNty.PushWebSocketPacketToUsersAsync(request); await scopedNty.PushWebSocketPacketToUsersAsync(request);
List<Account> accountsToNotify = []; List<Account> accountsToNotify = [];
@@ -524,25 +525,51 @@ public partial class ChatService(
}) })
.ToListAsync(); .ToListAsync();
var changesMembers = changes // Get messages that need member data
var messagesNeedingSenders = changes
.Where(c => c.Message != null) .Where(c => c.Message != null)
.Select(c => c.Message!.Sender) .Select(c => c.Message!)
.DistinctBy(x => x.Id)
.ToList(); .ToList();
changesMembers = await crs.LoadMemberAccounts(changesMembers);
foreach (var change in changes) // If no messages need senders, return with the latest timestamp from changes
if (messagesNeedingSenders.Count <= 0)
{ {
if (change.Message == null) continue; var latestTimestamp = changes.Count > 0
var sender = changesMembers.FirstOrDefault(x => x.Id == change.Message.SenderId); ? changes.Max(c => c.Timestamp)
if (sender is not null) : SystemClock.Instance.GetCurrentInstant();
change.Message.Sender = sender;
}
return new SyncResponse return new SyncResponse
{ {
Changes = changes, Changes = changes,
CurrentTimestamp = SystemClock.Instance.GetCurrentInstant() CurrentTimestamp = latestTimestamp
};
}
// Load member accounts for messages that need them
var changesMembers = messagesNeedingSenders
.Select(m => m.Sender)
.DistinctBy(x => x.Id)
.ToList();
changesMembers = await crs.LoadMemberAccounts(changesMembers);
// Update sender information for messages that have it
foreach (var message in messagesNeedingSenders)
{
var sender = changesMembers.FirstOrDefault(x => x.Id == message.SenderId);
if (sender is not null)
message.Sender = sender;
}
// Use the latest timestamp from changes, or current time if no changes
var latestChangeTimestamp = changes.Count > 0
? changes.Max(c => c.Timestamp)
: SystemClock.Instance.GetCurrentInstant();
return new SyncResponse
{
Changes = changes,
CurrentTimestamp = latestChangeTimestamp
}; };
} }