🐛 Fix chat room missing realms info

This commit is contained in:
2025-12-21 22:39:59 +08:00
parent a49d485943
commit 2aff62c64f
3 changed files with 33 additions and 5 deletions

View File

@@ -42,6 +42,8 @@ public class ChatRoomController(
if (chatRoom.Type != ChatRoomType.DirectMessage) return Ok(chatRoom); if (chatRoom.Type != ChatRoomType.DirectMessage) return Ok(chatRoom);
chatRoom = await crs.LoadChatRealms(chatRoom);
if (HttpContext.Items["CurrentUser"] is Account currentUser) if (HttpContext.Items["CurrentUser"] is Account currentUser)
chatRoom = await crs.LoadDirectMessageMembers(chatRoom, Guid.Parse(currentUser.Id)); chatRoom = await crs.LoadDirectMessageMembers(chatRoom, Guid.Parse(currentUser.Id));
@@ -62,6 +64,7 @@ public class ChatRoomController(
.Include(m => m.ChatRoom) .Include(m => m.ChatRoom)
.Select(m => m.ChatRoom) .Select(m => m.ChatRoom)
.ToListAsync(); .ToListAsync();
chatRooms = await crs.LoadChatRealms(chatRooms);
chatRooms = await crs.LoadDirectMessageMembers(chatRooms, accountId); chatRooms = await crs.LoadDirectMessageMembers(chatRooms, accountId);
chatRooms = await crs.SortChatRoomByLastMessage(chatRooms); chatRooms = await crs.SortChatRoomByLastMessage(chatRooms);
@@ -715,8 +718,10 @@ public class ChatRoomController(
.ToListAsync(); .ToListAsync();
var chatRooms = members.Select(m => m.ChatRoom).ToList(); var chatRooms = members.Select(m => m.ChatRoom).ToList();
chatRooms = await crs.LoadDirectMessageMembers(chatRooms, accountId);
chatRooms = await crs.LoadChatRealms(chatRooms);
var directMembers = var directMembers =
(await crs.LoadDirectMessageMembers(chatRooms, accountId)).ToDictionary(c => c.Id, c => c.Members); chatRooms.ToDictionary(c => c.Id, c => c.Members);
foreach (var member in members.Where(member => member.ChatRoom.Type == ChatRoomType.DirectMessage)) foreach (var member in members.Where(member => member.ChatRoom.Type == ChatRoomType.DirectMessage))
member.ChatRoom.Members = directMembers[member.ChatRoom.Id]; member.ChatRoom.Members = directMembers[member.ChatRoom.Id];

View File

@@ -9,7 +9,8 @@ namespace DysonNetwork.Sphere.Chat;
public class ChatRoomService( public class ChatRoomService(
AppDatabase db, AppDatabase db,
ICacheService cache, ICacheService cache,
RemoteAccountService remoteAccountsHelper RemoteAccountService remoteAccounts,
RemoteRealmService remoteRealms
) )
{ {
private const string ChatRoomGroupPrefix = "chatroom:"; private const string ChatRoomGroupPrefix = "chatroom:";
@@ -84,6 +85,26 @@ public class ChatRoomService(
return sortedRooms; return sortedRooms;
} }
public async Task<List<SnChatRoom>> LoadChatRealms(List<SnChatRoom> rooms)
{
var realmIds = rooms.Where(r => r.RealmId.HasValue).Select(r => r.RealmId!.Value.ToString()).Distinct().ToList();
var realms = await remoteRealms.GetRealmBatch(realmIds);
var realmDict = realms.ToDictionary(r => r.Id, r => r);
foreach (var room in rooms)
if (room.RealmId.HasValue && realmDict.TryGetValue(room.RealmId.Value, out var realm))
room.Realm = realm;
return rooms;
}
public async Task<SnChatRoom> LoadChatRealms(SnChatRoom room)
{
var result = await LoadChatRealms(new List<SnChatRoom> { room });
return result[0];
}
public async Task<List<SnChatRoom>> LoadDirectMessageMembers(List<SnChatRoom> rooms, Guid userId) public async Task<List<SnChatRoom>> LoadDirectMessageMembers(List<SnChatRoom> rooms, Guid userId)
{ {
var directRoomsId = rooms var directRoomsId = rooms
@@ -140,7 +161,7 @@ public class ChatRoomService(
public async Task<SnChatMember> LoadMemberAccount(SnChatMember member) public async Task<SnChatMember> LoadMemberAccount(SnChatMember member)
{ {
var account = await remoteAccountsHelper.GetAccount(member.AccountId); var account = await remoteAccounts.GetAccount(member.AccountId);
member.Account = SnAccount.FromProtoValue(account); member.Account = SnAccount.FromProtoValue(account);
return member; return member;
} }
@@ -148,7 +169,7 @@ public class ChatRoomService(
public async Task<List<SnChatMember>> LoadMemberAccounts(ICollection<SnChatMember> members) public async Task<List<SnChatMember>> LoadMemberAccounts(ICollection<SnChatMember> members)
{ {
var accountIds = members.Select(m => m.AccountId).ToList(); var accountIds = members.Select(m => m.AccountId).ToList();
var accounts = (await remoteAccountsHelper.GetAccountBatch(accountIds)).ToDictionary(a => Guid.Parse(a.Id), a => a); var accounts = (await remoteAccounts.GetAccountBatch(accountIds)).ToDictionary(a => Guid.Parse(a.Id), a => a);
return return
[ [

View File

@@ -8,7 +8,7 @@ namespace DysonNetwork.Sphere.Chat;
[ApiController] [ApiController]
[Route("/api/realms/{slug}")] [Route("/api/realms/{slug}")]
public class RealmChatController(AppDatabase db, RemoteRealmService rs) : ControllerBase public class RealmChatController(AppDatabase db, ChatRoomService crs, RemoteRealmService rs) : ControllerBase
{ {
[HttpGet("chat")] [HttpGet("chat")]
[Authorize] [Authorize]
@@ -29,6 +29,8 @@ public class RealmChatController(AppDatabase db, RemoteRealmService rs) : Contro
.Where(c => c.RealmId == realm.Id) .Where(c => c.RealmId == realm.Id)
.ToListAsync(); .ToListAsync();
chatRooms = await crs.LoadChatRealms(chatRooms);
return Ok(chatRooms); return Ok(chatRooms);
} }
} }