From 27f934c6348d6f2b3b927cf963bb11015cf8260d Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sat, 17 May 2025 22:36:46 +0800 Subject: [PATCH] :sparkles: DM groups --- .../Chat/ChatRoomController.cs | 56 ++++++------------- DysonNetwork.Sphere/Chat/ChatRoomService.cs | 40 +++++++++++++ 2 files changed, 56 insertions(+), 40 deletions(-) diff --git a/DysonNetwork.Sphere/Chat/ChatRoomController.cs b/DysonNetwork.Sphere/Chat/ChatRoomController.cs index 30f644d..3d97e58 100644 --- a/DysonNetwork.Sphere/Chat/ChatRoomController.cs +++ b/DysonNetwork.Sphere/Chat/ChatRoomController.cs @@ -16,7 +16,8 @@ public class ChatRoomController( FileService fs, ChatRoomService crs, RealmService rs, - ActionLogService als) : ControllerBase + ActionLogService als +) : ControllerBase { [HttpGet("{id:guid}")] public async Task> GetChatRoom(Guid id) @@ -28,23 +29,18 @@ public class ChatRoomController( if (chatRoom is null) return NotFound(); if (chatRoom.Type != ChatRoomType.DirectMessage) return Ok(chatRoom); - // Preload members for direct messages - var currentUser = HttpContext.Items["CurrentUser"] as Account.Account; - var directMembers = await db.ChatMembers - .Where(m => (currentUser != null && m.AccountId != currentUser!.Id)) - .Include(m => m.Account) - .Include(m => m.Account.Profile) - .ToListAsync(); - chatRoom.DirectMembers = directMembers.Select(ChatMemberTransmissionObject.FromEntity).ToList(); + if (HttpContext.Items["CurrentUser"] is Account.Account currentUser) + chatRoom = await crs.LoadDirectMessageMembers(chatRoom, currentUser.Id); + return Ok(chatRoom); } [HttpGet] + [Authorize] public async Task>> ListJoinedChatRooms() { if (HttpContext.Items["CurrentUser"] is not Account.Account currentUser) return Unauthorized(); - var userId = currentUser.Id; var chatRooms = await db.ChatMembers @@ -53,30 +49,9 @@ public class ChatRoomController( .Include(m => m.ChatRoom) .Select(m => m.ChatRoom) .ToListAsync(); + chatRooms = await crs.LoadDirectMessageMembers(chatRooms, userId); - var directRoomsId = chatRooms - .Where(r => r.Type == ChatRoomType.DirectMessage) - .Select(r => r.Id) - .ToList(); - var directMembers = directRoomsId.Count != 0 - ? await db.ChatMembers - .Where(m => directRoomsId.Contains(m.ChatRoomId)) - .Where(m => m.AccountId != userId) - .Include(m => m.Account) - .Include(m => m.Account.Profile) - .ToDictionaryAsync(m => m.ChatRoomId, m => m) - : new Dictionary(); - - // Map the results - var result = chatRooms.Select(r => - { - if (r.Type == ChatRoomType.DirectMessage && directMembers.TryGetValue(r.Id, out var otherMember)) - r.DirectMembers = new List - { ChatMemberTransmissionObject.FromEntity(otherMember) }; - return r; - }).ToList(); - - return Ok(result); + return Ok(chatRooms); } public class DirectMessageRequest @@ -454,7 +429,7 @@ public class ChatRoomController( .Where(m => m.ChatRoom.Type == ChatRoomType.DirectMessage) .Select(m => m.ChatRoom.Id) .ToList(); - + var directMembers = directRoomsId.Count != 0 ? await db.ChatMembers .Where(m => directRoomsId.Contains(m.ChatRoomId)) @@ -463,15 +438,16 @@ public class ChatRoomController( .Include(m => m.Account.Profile) .ToDictionaryAsync(m => m.ChatRoomId, m => m) : new Dictionary(); - + // Map the results members.ForEach(m => { - if (m.ChatRoom.Type == ChatRoomType.DirectMessage && directMembers.TryGetValue(m.ChatRoomId, out var otherMember)) + if (m.ChatRoom.Type == ChatRoomType.DirectMessage && + directMembers.TryGetValue(m.ChatRoomId, out var otherMember)) m.ChatRoom.DirectMembers = new List { ChatMemberTransmissionObject.FromEntity(otherMember) }; }); - + return members.ToList(); } @@ -497,7 +473,7 @@ public class ChatRoomController( ActionLogType.ChatroomJoin, new Dictionary { { "chatroom_id", roomId } }, Request ); - + return Ok(member); } @@ -621,7 +597,7 @@ public class ChatRoomController( ActionLogType.ChatroomKick, new Dictionary { { "chatroom_id", roomId }, { "account_id", memberId } }, Request ); - + return NoContent(); } @@ -660,7 +636,7 @@ public class ChatRoomController( ActionLogType.ChatroomLeave, new Dictionary { { "chatroom_id", roomId } }, Request ); - + return NoContent(); } } \ No newline at end of file diff --git a/DysonNetwork.Sphere/Chat/ChatRoomService.cs b/DysonNetwork.Sphere/Chat/ChatRoomService.cs index 68acb5e..94d341d 100644 --- a/DysonNetwork.Sphere/Chat/ChatRoomService.cs +++ b/DysonNetwork.Sphere/Chat/ChatRoomService.cs @@ -11,6 +11,46 @@ public class ChatRoomService(AppDatabase db, NotificationService nty) $"You just got invited to join {member.ChatRoom.Name}"); } + public async Task> LoadDirectMessageMembers(List rooms, Guid userId) + { + var directRoomsId = rooms + .Where(r => r.Type == ChatRoomType.DirectMessage) + .Select(r => r.Id) + .ToList(); + if (directRoomsId.Count == 0) return rooms; + + var directMembers = directRoomsId.Count != 0 + ? await db.ChatMembers + .Where(m => directRoomsId.Contains(m.ChatRoomId)) + .Where(m => m.AccountId != userId) + .Include(m => m.Account) + .Include(m => m.Account.Profile) + .GroupBy(m => m.ChatRoomId) + .ToDictionaryAsync(g => g.Key, g => g.ToList()) + : new Dictionary>(); + + return rooms.Select(r => + { + if (r.Type == ChatRoomType.DirectMessage && directMembers.TryGetValue(r.Id, out var otherMembers)) + r.DirectMembers = otherMembers.Select(ChatMemberTransmissionObject.FromEntity).ToList(); + return r; + }).ToList(); + } + + public async Task LoadDirectMessageMembers(ChatRoom room, Guid userId) + { + if (room.Type != ChatRoomType.DirectMessage) return room; + var members = await db.ChatMembers + .Where(m => m.ChatRoomId == room.Id && m.AccountId != userId) + .Include(m => m.Account) + .Include(m => m.Account.Profile) + .ToListAsync(); + + if (members.Count > 0) + room.DirectMembers = members.Select(ChatMemberTransmissionObject.FromEntity).ToList(); + return room; + } + public async Task IsMemberWithRole(Guid roomId, Guid accountId, ChatMemberRole requiredRole) { var member = await db.ChatMembers