:zsap: Pagination in chat sync
This commit is contained in:
@@ -553,12 +553,13 @@ public partial class ChatController(
|
|||||||
if (!isMember)
|
if (!isMember)
|
||||||
return StatusCode(403, "You are not a member of this chat room.");
|
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);
|
return Ok(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("{roomId:guid}/autocomplete")]
|
|
||||||
public async Task<ActionResult<List<DysonNetwork.Shared.Models.Autocompletion>>> ChatAutoComplete(
|
public async Task<ActionResult<List<Shared.Models.Autocompletion>>> ChatAutoComplete(
|
||||||
[FromBody] AutocompletionRequest request, Guid roomId)
|
[FromBody] AutocompletionRequest request, Guid roomId)
|
||||||
{
|
{
|
||||||
if (HttpContext.Items["CurrentUser"] is not Account currentUser)
|
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);
|
var result = await aus.GetAutocompletion(request.Content, chatId: roomId, limit: 10);
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -624,16 +624,22 @@ public partial class ChatService(
|
|||||||
.FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<SyncResponse> GetSyncDataAsync(Guid roomId, long lastSyncTimestamp)
|
public async Task<SyncResponse> 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
|
var syncMessages = await db.ChatMessages
|
||||||
.IgnoreQueryFilters()
|
|
||||||
.Include(m => m.Sender)
|
|
||||||
.Where(m => m.ChatRoomId == roomId)
|
.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();
|
.ToListAsync();
|
||||||
|
|
||||||
// Load member accounts for messages that need them
|
// Load member accounts for messages that need them
|
||||||
@@ -658,13 +664,14 @@ public partial class ChatService(
|
|||||||
}
|
}
|
||||||
|
|
||||||
var latestTimestamp = syncMessages.Count > 0
|
var latestTimestamp = syncMessages.Count > 0
|
||||||
? syncMessages.Max(m => m.UpdatedAt)
|
? syncMessages.Last().CreatedAt
|
||||||
: SystemClock.Instance.GetCurrentInstant();
|
: SystemClock.Instance.GetCurrentInstant();
|
||||||
|
|
||||||
return new SyncResponse
|
return new SyncResponse
|
||||||
{
|
{
|
||||||
Messages = syncMessages.OrderBy(m => m.UpdatedAt).ToList(),
|
Messages = syncMessages,
|
||||||
CurrentTimestamp = latestTimestamp
|
CurrentTimestamp = latestTimestamp,
|
||||||
|
TotalCount = totalCount
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -816,4 +823,5 @@ public class SyncResponse
|
|||||||
{
|
{
|
||||||
public List<SnChatMessage> Messages { get; set; } = [];
|
public List<SnChatMessage> Messages { get; set; } = [];
|
||||||
public Instant CurrentTimestamp { get; set; }
|
public Instant CurrentTimestamp { get; set; }
|
||||||
|
public int TotalCount { get; set; } = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ public class BroadcastEventHandler(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var requestData = packet.GetData<ChatController.MarkMessageReadRequest>();
|
var requestData = packet.GetData<Chat.ChatController.MarkMessageReadRequest>();
|
||||||
if (requestData == null)
|
if (requestData == null)
|
||||||
{
|
{
|
||||||
await SendErrorResponse(evt, "Invalid request data");
|
await SendErrorResponse(evt, "Invalid request data");
|
||||||
@@ -245,7 +245,7 @@ public class BroadcastEventHandler(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var requestData = packet.GetData<ChatController.ChatRoomWsUniversalRequest>();
|
var requestData = packet.GetData<Chat.ChatController.ChatRoomWsUniversalRequest>();
|
||||||
if (requestData == null)
|
if (requestData == null)
|
||||||
{
|
{
|
||||||
await SendErrorResponse(evt, "Invalid request data");
|
await SendErrorResponse(evt, "Invalid request data");
|
||||||
@@ -299,7 +299,7 @@ public class BroadcastEventHandler(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var requestData = packet.GetData<ChatController.ChatRoomWsUniversalRequest>();
|
var requestData = packet.GetData<Chat.ChatController.ChatRoomWsUniversalRequest>();
|
||||||
if (requestData == null)
|
if (requestData == null)
|
||||||
{
|
{
|
||||||
await SendErrorResponse(evt, "Invalid request data");
|
await SendErrorResponse(evt, "Invalid request data");
|
||||||
@@ -327,7 +327,7 @@ public class BroadcastEventHandler(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var requestData = packet.GetData<ChatController.ChatRoomWsUniversalRequest>();
|
var requestData = packet.GetData<Chat.ChatController.ChatRoomWsUniversalRequest>();
|
||||||
if (requestData == null)
|
if (requestData == null)
|
||||||
{
|
{
|
||||||
await SendErrorResponse(evt, "Invalid request data");
|
await SendErrorResponse(evt, "Invalid request data");
|
||||||
|
|||||||
Reference in New Issue
Block a user