From 2eff4364c983c899ed2967a783ecb7119f322636 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sat, 24 May 2025 02:12:32 +0800 Subject: [PATCH] :sparkles: Sort chat rooms by last message created at --- DysonNetwork.Sphere/Chat/ChatRoomController.cs | 1 + DysonNetwork.Sphere/Chat/ChatRoomService.cs | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/DysonNetwork.Sphere/Chat/ChatRoomController.cs b/DysonNetwork.Sphere/Chat/ChatRoomController.cs index 5df6cb2..802dd07 100644 --- a/DysonNetwork.Sphere/Chat/ChatRoomController.cs +++ b/DysonNetwork.Sphere/Chat/ChatRoomController.cs @@ -54,6 +54,7 @@ public class ChatRoomController( .Select(m => m.ChatRoom) .ToListAsync(); chatRooms = await crs.LoadDirectMessageMembers(chatRooms, userId); + chatRooms = await crs.SortChatRoomByLastMessage(chatRooms); return Ok(chatRooms); } diff --git a/DysonNetwork.Sphere/Chat/ChatRoomService.cs b/DysonNetwork.Sphere/Chat/ChatRoomService.cs index d556a79..5fa91fc 100644 --- a/DysonNetwork.Sphere/Chat/ChatRoomService.cs +++ b/DysonNetwork.Sphere/Chat/ChatRoomService.cs @@ -1,6 +1,7 @@ using DysonNetwork.Sphere.Account; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; +using NodaTime; namespace DysonNetwork.Sphere.Chat; @@ -32,6 +33,23 @@ public class ChatRoomService(AppDatabase db, IMemoryCache cache) var cacheKey = string.Format(RoomMembersCacheKey, roomId); cache.Remove(cacheKey); } + + public async Task> SortChatRoomByLastMessage(List rooms) + { + var roomIds = rooms.Select(r => r.Id).ToList(); + var lastMessages = await db.ChatMessages + .Where(m => roomIds.Contains(m.ChatRoomId)) + .GroupBy(m => m.ChatRoomId) + .Select(g => new { RoomId = g.Key, CreatedAt = g.Max(m => m.CreatedAt) }) + .ToDictionaryAsync(g => g.RoomId, m => m.CreatedAt); + + var now = SystemClock.Instance.GetCurrentInstant(); + var sortedRooms = rooms + .OrderByDescending(r => lastMessages.TryGetValue(r.Id, out var time) ? time : now) + .ToList(); + + return sortedRooms; + } public async Task> LoadDirectMessageMembers(List rooms, Guid userId) {