diff --git a/DysonNetwork.Sphere/Chat/ChatController.cs b/DysonNetwork.Sphere/Chat/ChatController.cs index ed0c634..996b74a 100644 --- a/DysonNetwork.Sphere/Chat/ChatController.cs +++ b/DysonNetwork.Sphere/Chat/ChatController.cs @@ -553,12 +553,13 @@ public partial class ChatController( if (!isMember) return StatusCode(403, "You are not a member of this chat room."); - var response = await cs.GetSyncDataAsync(roomId, request.LastSyncTimestamp); + var response = await cs.GetSyncDataAsync(roomId, request.LastSyncTimestamp, 500); + Response.Headers["X-Total"] = response.TotalCount.ToString(); return Ok(response); } - [HttpPost("{roomId:guid}/autocomplete")] - public async Task>> ChatAutoComplete( + + public async Task>> ChatAutoComplete( [FromBody] AutocompletionRequest request, Guid roomId) { if (HttpContext.Items["CurrentUser"] is not Account currentUser) @@ -574,4 +575,4 @@ public partial class ChatController( var result = await aus.GetAutocompletion(request.Content, chatId: roomId, limit: 10); return Ok(result); } -} +} \ No newline at end of file diff --git a/DysonNetwork.Sphere/Chat/ChatService.cs b/DysonNetwork.Sphere/Chat/ChatService.cs index 4263be1..ef97ea3 100644 --- a/DysonNetwork.Sphere/Chat/ChatService.cs +++ b/DysonNetwork.Sphere/Chat/ChatService.cs @@ -624,16 +624,22 @@ public partial class ChatService( .FirstOrDefaultAsync(); } - public async Task GetSyncDataAsync(Guid roomId, long lastSyncTimestamp) + public async Task GetSyncDataAsync(Guid roomId, long lastSyncTimestamp, int limit = 500) { - var timestamp = Instant.FromUnixTimeMilliseconds(lastSyncTimestamp); + var lastSyncInstant = Instant.FromUnixTimeMilliseconds(lastSyncTimestamp); - // Get all messages that have been modified since the last sync + // Count total newer messages + var totalCount = await db.ChatMessages + .Where(m => m.ChatRoomId == roomId && m.CreatedAt > lastSyncInstant) + .CountAsync(); + + // Get up to limit messages that have been created since the last sync var syncMessages = await db.ChatMessages - .IgnoreQueryFilters() - .Include(m => m.Sender) .Where(m => m.ChatRoomId == roomId) - .Where(m => m.UpdatedAt > timestamp || m.DeletedAt > timestamp) + .Where(m => m.CreatedAt > lastSyncInstant) + .OrderBy(m => m.CreatedAt) + .Take(limit) + .Include(m => m.Sender) .ToListAsync(); // Load member accounts for messages that need them @@ -658,13 +664,14 @@ public partial class ChatService( } var latestTimestamp = syncMessages.Count > 0 - ? syncMessages.Max(m => m.UpdatedAt) + ? syncMessages.Last().CreatedAt : SystemClock.Instance.GetCurrentInstant(); return new SyncResponse { - Messages = syncMessages.OrderBy(m => m.UpdatedAt).ToList(), - CurrentTimestamp = latestTimestamp + Messages = syncMessages, + CurrentTimestamp = latestTimestamp, + TotalCount = totalCount }; } @@ -816,4 +823,5 @@ public class SyncResponse { public List Messages { get; set; } = []; public Instant CurrentTimestamp { get; set; } + public int TotalCount { get; set; } = 0; } diff --git a/DysonNetwork.Sphere/Startup/BroadcastEventHandler.cs b/DysonNetwork.Sphere/Startup/BroadcastEventHandler.cs index d70998d..f45df45 100644 --- a/DysonNetwork.Sphere/Startup/BroadcastEventHandler.cs +++ b/DysonNetwork.Sphere/Startup/BroadcastEventHandler.cs @@ -217,7 +217,7 @@ public class BroadcastEventHandler( return; } - var requestData = packet.GetData(); + var requestData = packet.GetData(); if (requestData == null) { await SendErrorResponse(evt, "Invalid request data"); @@ -245,7 +245,7 @@ public class BroadcastEventHandler( return; } - var requestData = packet.GetData(); + var requestData = packet.GetData(); if (requestData == null) { await SendErrorResponse(evt, "Invalid request data"); @@ -299,7 +299,7 @@ public class BroadcastEventHandler( return; } - var requestData = packet.GetData(); + var requestData = packet.GetData(); if (requestData == null) { await SendErrorResponse(evt, "Invalid request data"); @@ -327,7 +327,7 @@ public class BroadcastEventHandler( return; } - var requestData = packet.GetData(); + var requestData = packet.GetData(); if (requestData == null) { await SendErrorResponse(evt, "Invalid request data");