Adds Messaging streaming
This commit is contained in:
@@ -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; }
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
46
src/Web/Features/Messages/Handlers/GetReplies.cs
Normal file
46
src/Web/Features/Messages/Handlers/GetReplies.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user