diff --git a/src/Web/Features/Messages/Data/MessagingDbContext.cs b/src/Web/Features/Messages/Data/MessagingDbContext.cs index a7b2028..5f19b86 100644 --- a/src/Web/Features/Messages/Data/MessagingDbContext.cs +++ b/src/Web/Features/Messages/Data/MessagingDbContext.cs @@ -56,4 +56,21 @@ public class MessagingDbContext( return messages; } + + public async Task GetMessageCountAsync( + Guid subjectId, + Guid? parentId, + int pageSize, + CancellationToken ct = default) + { + var query = Messages + .Where(c => c.SubjectId == subjectId) + .Where(c => c.ParentId == parentId); + + var messageCount = await query + .Take(pageSize) + .CountAsync(ct); + + return messageCount; + } } diff --git a/src/Web/Features/Messages/Handlers/GetMessageCount.cs b/src/Web/Features/Messages/Handlers/GetMessageCount.cs new file mode 100644 index 0000000..0aea77a --- /dev/null +++ b/src/Web/Features/Messages/Handlers/GetMessageCount.cs @@ -0,0 +1,44 @@ +using Hutopy.Web.Features.Messages.Data; + +namespace Hutopy.Web.Features.Messages.Handlers; + +public sealed class GetMessageCountRequest +{ + public Guid SubjectId { get; set; } + [BindFrom("page_size")] public int PageSize { get; set; } = 1000; +} + +public record struct GetMessageCountResponse +{ + public required int Count { get; init; } +} + +public class GetMessageCount( + MessagingDbContext context) + : Endpoint +{ + public override void Configure() + { + Get("/api/message-count/{SubjectId:guid}"); + Options(o => o.WithTags("Messages")); + AllowAnonymous(); + } + + public override async Task HandleAsync( + GetMessageCountRequest req, + CancellationToken ct) + { + var messageCount = await context.GetMessageCountAsync( + req.SubjectId, + null, + req.PageSize, + ct); + + await SendAsync( + new() + { + Count = messageCount + }, + cancellation: ct); + } +}