Adds Messaging streaming

This commit is contained in:
Jonathan Bourdon
2024-07-19 00:44:03 -04:00
parent 8b5ab2d769
commit d268625f19
9 changed files with 80 additions and 58 deletions

View File

@@ -4,7 +4,7 @@ public class Content
{ {
public Guid Id { get; init; } public Guid Id { get; init; }
public Guid CreatedBy { get; init; } public Guid CreatedBy { get; init; }
public DateTimeOffset CreatedAt { get; } public DateTimeOffset CreatedAt { get; init; }
public string? Title { get; init; } public string? Title { get; init; }
public string? Description { get; init; } public string? Description { get; init; }

View File

@@ -4,14 +4,14 @@ using Microsoft.EntityFrameworkCore;
namespace Hutopy.Web.Features.Contents.Handlers; namespace Hutopy.Web.Features.Contents.Handlers;
public sealed class GetContentsRequest public sealed class GetContentRequest
{ {
public Guid ContentId { get; set; } public Guid ContentId { get; set; }
} }
public class GetContents( public class GetContent(
ContentDbContext context) ContentDbContext context)
: Endpoint<GetContentsRequest, Content> : Endpoint<GetContentRequest, Content>
{ {
public override void Configure() public override void Configure()
{ {
@@ -21,7 +21,7 @@ public class GetContents(
} }
public override async Task HandleAsync( public override async Task HandleAsync(
GetContentsRequest req, GetContentRequest req,
CancellationToken ct) CancellationToken ct)
{ {
var content = await context var content = await context

View File

@@ -7,7 +7,7 @@ namespace Hutopy.Web.Features.Contents.Handlers;
public sealed class GetContentsByUserRequest public sealed class GetContentsByUserRequest
{ {
public Guid UserId { get; set; } public Guid UserId { get; set; }
[BindFrom("max_items")] public int MaxItems { get; set; } = 10; [BindFrom("page_size")] public int PageSize { get; set; } = 10;
[BindFrom("last_id")] public Guid? LastId { get; set; } [BindFrom("last_id")] public Guid? LastId { get; set; }
} }
@@ -30,12 +30,12 @@ public class GetContentsByUser(
.Contents .Contents
.Where(c => c.CreatedBy == req.UserId); .Where(c => c.CreatedBy == req.UserId);
if (req.LastId is not null) query = query.OrderByDescending(c => c.CreatedAt);
query = query.OrderByDescending(c => c.Id).Where(c => c.Id < req.LastId.Value);
else
query = query.OrderByDescending(c => c.Id);
query = query.Take(req.MaxItems); if (req.LastId is not null)
query = query.Where(c => c.Id < req.LastId.Value);
query = query.Take(req.PageSize);
var posts = await query.ToListAsync(cancellationToken: ct); var posts = await query.ToListAsync(cancellationToken: ct);

View File

@@ -5,7 +5,7 @@ public class Message
public Guid Id { get; init; } public Guid Id { get; init; }
public Guid SubjectId { get; init; } public Guid SubjectId { get; init; }
public Guid CreatedBy { get; init; } public Guid CreatedBy { get; init; }
public DateTimeOffset CreatedAt { get; } public DateTimeOffset CreatedAt { get; init; }
public Guid? ParentId { get; init; } public Guid? ParentId { get; init; }
public string Value { get; init; } public string Value { get; init; }
} }

View File

@@ -4,15 +4,15 @@ using Hutopy.Web.Features.Messages.Data;
namespace Hutopy.Web.Features.Messages.Handlers; namespace Hutopy.Web.Features.Messages.Handlers;
public class PostMessageRequest public class AddMessageRequest
{ {
public Guid SubjectId { get; set; } public Guid SubjectId { get; set; }
public string Message { get; set; } public string Message { get; set; }
} }
public class PostMessage( public class AddMessage(
MessagingDbContext context) MessagingDbContext context)
: Endpoint<PostMessageRequest> : Endpoint<AddMessageRequest>
{ {
public override void Configure() public override void Configure()
{ {
@@ -21,7 +21,7 @@ public class PostMessage(
} }
public override async Task HandleAsync( public override async Task HandleAsync(
PostMessageRequest req, AddMessageRequest req,
CancellationToken ct) CancellationToken ct)
{ {
var message = new Message var message = new Message

View File

@@ -4,16 +4,16 @@ using Hutopy.Web.Features.Messages.Data;
namespace Hutopy.Web.Features.Messages.Handlers; namespace Hutopy.Web.Features.Messages.Handlers;
internal sealed class PostReplyMessageRequest internal sealed class AddReplyRequest
{ {
public required Guid SubjectId { get; set; } public required Guid SubjectId { get; set; }
public required Guid ParentId { get; set; } public required Guid ParentId { get; set; }
public required string Message { get; set; } public required string Message { get; set; }
} }
internal sealed class PostReplyMessage( internal sealed class AddReply(
MessagingDbContext context) MessagingDbContext context)
: Endpoint<PostReplyMessageRequest> : Endpoint<AddReplyRequest>
{ {
public override void Configure() public override void Configure()
{ {
@@ -22,7 +22,7 @@ internal sealed class PostReplyMessage(
} }
public override async Task HandleAsync( public override async Task HandleAsync(
PostReplyMessageRequest req, AddReplyRequest req,
CancellationToken ct) CancellationToken ct)
{ {
var message = new Message var message = new Message

View File

@@ -7,6 +7,8 @@ namespace Hutopy.Web.Features.Messages.Handlers;
public class GetMessagesRequest public class GetMessagesRequest
{ {
public Guid SubjectId { get; set; } public Guid SubjectId { get; set; }
[BindFrom("page_size")] public int PageSize { get; set; } = 10;
[BindFrom("last_id")] public Guid? LastId { get; set; }
} }
public class GetMessages( public class GetMessages(
@@ -24,12 +26,20 @@ public class GetMessages(
GetMessagesRequest req, GetMessagesRequest req,
CancellationToken ct) CancellationToken ct)
{ {
var comments = await context var query = context
.Messages .Messages
.Where(c => c.SubjectId == req.SubjectId) .Where(c => c.SubjectId == req.SubjectId)
.Where(c => c.ParentId == null) .Where(c => c.ParentId == null);
.ToListAsync(cancellationToken: ct);
await SendAsync(comments, cancellation: ct); query = query.OrderByDescending(c => c.CreatedAt);
if (req.LastId is not null)
query = query.Where(c => c.Id < req.LastId.Value);
query = query.Take(req.PageSize);
var messages = await query.ToListAsync(cancellationToken: ct);
await SendAsync(messages, cancellation: ct);
} }
} }

View File

@@ -1,34 +0,0 @@
using FastEndpoints;
using Hutopy.Web.Features.Messages.Data;
using Microsoft.EntityFrameworkCore;
namespace Hutopy.Web.Features.Messages.Handlers;
public class GetMessagesRepliesRequest
{
public Guid ParentId { get; set; }
}
public class GetMessagesByParent(
MessagingDbContext context)
: Endpoint<GetMessagesRepliesRequest, List<Message>>
{
public override void Configure()
{
Get("/api/messages/{ParentId:guid}/replies");
Options(o => o.WithTags("Messages"));
AllowAnonymous();
}
public override async Task HandleAsync(
GetMessagesRepliesRequest req,
CancellationToken ct)
{
var posts = await context
.Messages
.Where(c => c.ParentId == req.ParentId)
.ToListAsync(cancellationToken: ct);
await SendAsync(posts, cancellation: ct);
}
}

View File

@@ -0,0 +1,46 @@
using FastEndpoints;
using Hutopy.Web.Features.Messages.Data;
using Microsoft.EntityFrameworkCore;
namespace Hutopy.Web.Features.Messages.Handlers;
public class GetRepliesRequest
{
public Guid SubjectId { get; set; }
public Guid ParentId { get; set; }
[BindFrom("page_size")] public int PageSize { get; set; } = 10;
[BindFrom("last_id")] public Guid? LastId { get; set; }
}
public class GetReplies(
MessagingDbContext context)
: Endpoint<GetRepliesRequest, List<Message>>
{
public override void Configure()
{
Get("/api/messages/{ParentId:guid}/replies");
Options(o => o.WithTags("Messages"));
AllowAnonymous();
}
public override async Task HandleAsync(
GetRepliesRequest req,
CancellationToken ct)
{
var query = context
.Messages
.Where(c => c.SubjectId == req.SubjectId)
.Where(c => c.ParentId == req.ParentId);
query = query.OrderByDescending(c => c.CreatedAt);
if (req.LastId is not null)
query = query.Where(c => c.Id < req.LastId.Value);
query = query.Take(req.PageSize);
var replies = await query.ToListAsync(cancellationToken: ct);
await SendAsync(replies, cancellation: ct);
}
}