♻️ 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!)
.ToList();
// If no messages need senders, return with the latest timestamp from changes
if (messagesNeedingSenders.Count <= 0)
{
var latestTimestamp = changes.Count > 0
? changes.Max(c => c.Timestamp)
: SystemClock.Instance.GetCurrentInstant();
return new SyncResponse
{
Changes = changes,
CurrentTimestamp = latestTimestamp
};
}
// Load member accounts for messages that need them
var changesMembers = messagesNeedingSenders
.Select(m => m.Sender)
.DistinctBy(x => x.Id) .DistinctBy(x => x.Id)
.ToList(); .ToList();
changesMembers = await crs.LoadMemberAccounts(changesMembers); changesMembers = await crs.LoadMemberAccounts(changesMembers);
foreach (var change in changes) // Update sender information for messages that have it
foreach (var message in messagesNeedingSenders)
{ {
if (change.Message == null) continue; var sender = changesMembers.FirstOrDefault(x => x.Id == message.SenderId);
var sender = changesMembers.FirstOrDefault(x => x.Id == change.Message.SenderId);
if (sender is not null) if (sender is not null)
change.Message.Sender = sender; 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 return new SyncResponse
{ {
Changes = changes, Changes = changes,
CurrentTimestamp = SystemClock.Instance.GetCurrentInstant() CurrentTimestamp = latestChangeTimestamp
}; };
} }
@@ -654,4 +681,4 @@ public class SyncResponse
{ {
public List<MessageChange> Changes { get; set; } = []; public List<MessageChange> Changes { get; set; } = [];
public Instant CurrentTimestamp { get; set; } public Instant CurrentTimestamp { get; set; }
} }