♻️ 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),
},
};
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);
List<Account> accountsToNotify = [];
@@ -524,25 +525,51 @@ public partial class ChatService(
})
.ToListAsync();
var changesMembers = changes
// Get messages that need member data
var messagesNeedingSenders = changes
.Where(c => c.Message != null)
.Select(c => c.Message!.Sender)
.DistinctBy(x => x.Id)
.Select(c => c.Message!)
.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 sender = changesMembers.FirstOrDefault(x => x.Id == change.Message.SenderId);
if (sender is not null)
change.Message.Sender = sender;
}
var latestTimestamp = changes.Count > 0
? changes.Max(c => c.Timestamp)
: SystemClock.Instance.GetCurrentInstant();
return new SyncResponse
{
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
};
}