❇️ Chat room summary api
This commit is contained in:
parent
c3390d7248
commit
19174de873
@ -24,6 +24,36 @@ public partial class ChatController(AppDatabase db, ChatService cs) : Controller
|
|||||||
public Guid ChatRoomId { get; set; }
|
public Guid ChatRoomId { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class ChatSummaryResponse
|
||||||
|
{
|
||||||
|
public int UnreadCount { get; set; }
|
||||||
|
public Message? LastMessage { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("summary")]
|
||||||
|
[Authorize]
|
||||||
|
public async Task<ActionResult<Dictionary<Guid, ChatSummaryResponse>>> GetChatSummary()
|
||||||
|
{
|
||||||
|
if (HttpContext.Items["CurrentUser"] is not Account.Account currentUser) return Unauthorized();
|
||||||
|
|
||||||
|
var unreadMessages = await cs.CountUnreadMessageForUser(currentUser.Id);
|
||||||
|
var lastMessages = await cs.ListLastMessageForUser(currentUser.Id);
|
||||||
|
|
||||||
|
var result = unreadMessages.Keys
|
||||||
|
.Union(lastMessages.Keys)
|
||||||
|
.ToDictionary(
|
||||||
|
roomId => roomId,
|
||||||
|
roomId => new ChatSummaryResponse
|
||||||
|
{
|
||||||
|
UnreadCount = unreadMessages.GetValueOrDefault(roomId),
|
||||||
|
LastMessage = lastMessages.GetValueOrDefault(roomId)
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return Ok(result);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public class SendMessageRequest
|
public class SendMessageRequest
|
||||||
{
|
{
|
||||||
[MaxLength(4096)] public string? Content { get; set; }
|
[MaxLength(4096)] public string? Content { get; set; }
|
||||||
|
@ -107,7 +107,7 @@ public class ChatService(AppDatabase db, FileService fs, IServiceScopeFactory sc
|
|||||||
return messages.Count(m => !m.IsRead);
|
return messages.Count(m => !m.IsRead);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Dictionary<Guid, int>> CountUnreadMessagesForJoinedRoomsAsync(Guid userId)
|
public async Task<Dictionary<Guid, int>> CountUnreadMessageForUser(Guid userId)
|
||||||
{
|
{
|
||||||
var cutoff = SystemClock.Instance.GetCurrentInstant().Minus(Duration.FromDays(30));
|
var cutoff = SystemClock.Instance.GetCurrentInstant().Minus(Duration.FromDays(30));
|
||||||
var userRooms = await db.ChatMembers
|
var userRooms = await db.ChatMembers
|
||||||
@ -133,6 +133,29 @@ public class ChatService(AppDatabase db, FileService fs, IServiceScopeFactory sc
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<Dictionary<Guid, Message?>> ListLastMessageForUser(Guid userId)
|
||||||
|
{
|
||||||
|
var userRooms = await db.ChatMembers
|
||||||
|
.Where(m => m.AccountId == userId)
|
||||||
|
.Select(m => m.ChatRoomId)
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
|
var messages = await db.ChatMessages
|
||||||
|
.IgnoreQueryFilters()
|
||||||
|
.Include(m => m.Sender)
|
||||||
|
.Include(m => m.Sender.Account)
|
||||||
|
.Include(m => m.Sender.Account.Profile)
|
||||||
|
.Where(m => userRooms.Contains(m.ChatRoomId))
|
||||||
|
.GroupBy(m => m.ChatRoomId)
|
||||||
|
.Select(g => g.OrderByDescending(m => m.CreatedAt).FirstOrDefault())
|
||||||
|
.ToDictionaryAsync(
|
||||||
|
m => m!.ChatRoomId,
|
||||||
|
m => m
|
||||||
|
);
|
||||||
|
|
||||||
|
return messages;
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<RealtimeCall> CreateCallAsync(ChatRoom room, ChatMember sender)
|
public async Task<RealtimeCall> CreateCallAsync(ChatRoom room, ChatMember sender)
|
||||||
{
|
{
|
||||||
var call = new RealtimeCall
|
var call = new RealtimeCall
|
||||||
|
Loading…
x
Reference in New Issue
Block a user