✨ Sort chat rooms by last message created at
This commit is contained in:
parent
b905d674b7
commit
2eff4364c9
@ -54,6 +54,7 @@ public class ChatRoomController(
|
|||||||
.Select(m => m.ChatRoom)
|
.Select(m => m.ChatRoom)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
chatRooms = await crs.LoadDirectMessageMembers(chatRooms, userId);
|
chatRooms = await crs.LoadDirectMessageMembers(chatRooms, userId);
|
||||||
|
chatRooms = await crs.SortChatRoomByLastMessage(chatRooms);
|
||||||
|
|
||||||
return Ok(chatRooms);
|
return Ok(chatRooms);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
using DysonNetwork.Sphere.Account;
|
using DysonNetwork.Sphere.Account;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Caching.Memory;
|
using Microsoft.Extensions.Caching.Memory;
|
||||||
|
using NodaTime;
|
||||||
|
|
||||||
namespace DysonNetwork.Sphere.Chat;
|
namespace DysonNetwork.Sphere.Chat;
|
||||||
|
|
||||||
@ -32,6 +33,23 @@ public class ChatRoomService(AppDatabase db, IMemoryCache cache)
|
|||||||
var cacheKey = string.Format(RoomMembersCacheKey, roomId);
|
var cacheKey = string.Format(RoomMembersCacheKey, roomId);
|
||||||
cache.Remove(cacheKey);
|
cache.Remove(cacheKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<List<ChatRoom>> SortChatRoomByLastMessage(List<ChatRoom> 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<List<ChatRoom>> LoadDirectMessageMembers(List<ChatRoom> rooms, Guid userId)
|
public async Task<List<ChatRoom>> LoadDirectMessageMembers(List<ChatRoom> rooms, Guid userId)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user