✨ Notify level API on chat
🗃️ Enrich the settings of chat members 🐛 Fix role settings on both chat & realm
This commit is contained in:
@ -9,14 +9,14 @@ public class ChatRoomService(AppDatabase db, ICacheService cache)
|
||||
public const string ChatRoomGroupPrefix = "ChatRoom_";
|
||||
private const string RoomMembersCacheKeyPrefix = "ChatRoomMembers_";
|
||||
private const string ChatMemberCacheKey = "ChatMember_{0}_{1}";
|
||||
|
||||
|
||||
public async Task<List<ChatMember>> ListRoomMembers(Guid roomId)
|
||||
{
|
||||
var cacheKey = RoomMembersCacheKeyPrefix + roomId;
|
||||
var cachedMembers = await cache.GetAsync<List<ChatMember>>(cacheKey);
|
||||
if (cachedMembers != null)
|
||||
return cachedMembers;
|
||||
|
||||
|
||||
var members = await db.ChatMembers
|
||||
.Include(m => m.Account)
|
||||
.ThenInclude(m => m.Profile)
|
||||
@ -27,18 +27,18 @@ public class ChatRoomService(AppDatabase db, ICacheService cache)
|
||||
|
||||
var chatRoomGroup = ChatRoomGroupPrefix + roomId;
|
||||
await cache.SetWithGroupsAsync(cacheKey, members,
|
||||
[chatRoomGroup],
|
||||
[chatRoomGroup],
|
||||
TimeSpan.FromMinutes(5));
|
||||
|
||||
|
||||
return members;
|
||||
}
|
||||
|
||||
|
||||
public async Task<ChatMember?> GetRoomMember(Guid accountId, Guid chatRoomId)
|
||||
{
|
||||
var cacheKey = string.Format(ChatMemberCacheKey, accountId, chatRoomId);
|
||||
var member = await cache.GetAsync<ChatMember?>(cacheKey);
|
||||
if (member is not null) return member;
|
||||
|
||||
|
||||
member = await db.ChatMembers
|
||||
.Include(m => m.Account)
|
||||
.ThenInclude(m => m.Profile)
|
||||
@ -50,12 +50,12 @@ public class ChatRoomService(AppDatabase db, ICacheService cache)
|
||||
if (member == null) return member;
|
||||
var chatRoomGroup = ChatRoomGroupPrefix + chatRoomId;
|
||||
await cache.SetWithGroupsAsync(cacheKey, member,
|
||||
[chatRoomGroup],
|
||||
[chatRoomGroup],
|
||||
TimeSpan.FromMinutes(5));
|
||||
|
||||
return member;
|
||||
}
|
||||
|
||||
|
||||
public async Task PurgeRoomMembersCache(Guid roomId)
|
||||
{
|
||||
var chatRoomGroup = ChatRoomGroupPrefix + roomId;
|
||||
@ -70,15 +70,15 @@ public class ChatRoomService(AppDatabase db, ICacheService cache)
|
||||
.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)
|
||||
{
|
||||
var directRoomsId = rooms
|
||||
@ -86,7 +86,7 @@ public class ChatRoomService(AppDatabase db, ICacheService cache)
|
||||
.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))
|
||||
@ -97,7 +97,7 @@ public class ChatRoomService(AppDatabase db, ICacheService cache)
|
||||
.GroupBy(m => m.ChatRoomId)
|
||||
.ToDictionaryAsync(g => g.Key, g => g.ToList())
|
||||
: new Dictionary<Guid, List<ChatMember>>();
|
||||
|
||||
|
||||
return rooms.Select(r =>
|
||||
{
|
||||
if (r.Type == ChatRoomType.DirectMessage && directMembers.TryGetValue(r.Id, out var otherMembers))
|
||||
@ -105,7 +105,7 @@ public class ChatRoomService(AppDatabase db, ICacheService cache)
|
||||
return r;
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
|
||||
public async Task<ChatRoom> LoadDirectMessageMembers(ChatRoom room, Guid userId)
|
||||
{
|
||||
if (room.Type != ChatRoomType.DirectMessage) return room;
|
||||
@ -115,17 +115,17 @@ public class ChatRoomService(AppDatabase db, ICacheService cache)
|
||||
.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<bool> IsMemberWithRole(Guid roomId, Guid accountId, params ChatMemberRole[] requiredRoles)
|
||||
|
||||
public async Task<bool> IsMemberWithRole(Guid roomId, Guid accountId, params int[] requiredRoles)
|
||||
{
|
||||
if (requiredRoles.Length == 0)
|
||||
return false;
|
||||
|
||||
|
||||
var maxRequiredRole = requiredRoles.Max();
|
||||
var member = await db.ChatMembers
|
||||
.FirstOrDefaultAsync(m => m.ChatRoomId == roomId && m.AccountId == accountId);
|
||||
|
Reference in New Issue
Block a user