diff --git a/src/Web/Messages/Data/Message.cs b/src/Web/Messages/Data/Message.cs index 09d3b6b..f1255ed 100644 --- a/src/Web/Messages/Data/Message.cs +++ b/src/Web/Messages/Data/Message.cs @@ -6,6 +6,6 @@ public class Message public Guid SubjectId { get; init; } public Guid CreatedBy { get; init; } public DateTimeOffset CreatedAt { get; } - public Guid ParentId { get; init; } + public Guid? ParentId { get; init; } public string Value { get; init; } } diff --git a/src/Web/Messages/Handlers/GetMessages.cs b/src/Web/Messages/Handlers/GetMessages.cs index 6325548..b29c9c4 100644 --- a/src/Web/Messages/Handlers/GetMessages.cs +++ b/src/Web/Messages/Handlers/GetMessages.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; namespace Hutopy.Web.Messages.Handlers; -public sealed class GetMessagesRequest +public class GetMessagesRequest { public Guid SubjectId { get; set; } } @@ -27,6 +27,7 @@ public class GetMessages( var comments = await context .Messages .Where(c => c.SubjectId == req.SubjectId) + .Where(c => c.ParentId == null) .ToListAsync(cancellationToken: ct); await SendAsync(comments, cancellation: ct); diff --git a/src/Web/Messages/Handlers/GetMessagesByParent.cs b/src/Web/Messages/Handlers/GetMessagesByParent.cs new file mode 100644 index 0000000..39ff534 --- /dev/null +++ b/src/Web/Messages/Handlers/GetMessagesByParent.cs @@ -0,0 +1,34 @@ +using FastEndpoints; +using Hutopy.Web.Messages.Data; +using Microsoft.EntityFrameworkCore; + +namespace Hutopy.Web.Messages.Handlers; + +public class GetMessagesRepliesRequest +{ + public Guid ParentId { get; set; } +} + +public class GetMessagesByParent( + MessagingDbContext context) + : Endpoint> +{ + 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); + } +} diff --git a/src/Web/Messages/Handlers/GetMessagesByUser.cs b/src/Web/Messages/Handlers/GetMessagesByUser.cs index 6f1e447..c6f6a72 100644 --- a/src/Web/Messages/Handlers/GetMessagesByUser.cs +++ b/src/Web/Messages/Handlers/GetMessagesByUser.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; namespace Hutopy.Web.Messages.Handlers; -public sealed class GetMessagesByUserRequest +public class GetMessagesByUserRequest { public Guid UserId { get; set; } } @@ -17,6 +17,7 @@ public class GetMessagesByUser( { Get("/api/messages/user/{UserId:guid}"); Options(o => o.WithTags("Messages")); + AllowAnonymous(); } public override async Task HandleAsync( @@ -26,6 +27,7 @@ public class GetMessagesByUser( var posts = await context .Messages .Where(c => c.CreatedBy == req.UserId) + .Where(c => c.ParentId == null) .ToListAsync(cancellationToken: ct); await SendAsync(posts, cancellation: ct); diff --git a/src/Web/Messages/Handlers/PostMessage.cs b/src/Web/Messages/Handlers/PostMessage.cs index 65d7882..a4d5240 100644 --- a/src/Web/Messages/Handlers/PostMessage.cs +++ b/src/Web/Messages/Handlers/PostMessage.cs @@ -4,9 +4,11 @@ using Hutopy.Web.Messages.Data; namespace Hutopy.Web.Messages.Handlers; -public record PostMessageRequest( - Guid SubjectId, - string Message); +public class PostMessageRequest +{ + public Guid SubjectId { get; set; } + public string Message { get; set; } +} public class PostMessage( MessagingDbContext context) @@ -22,15 +24,15 @@ public class PostMessage( PostMessageRequest req, CancellationToken ct) { - await context.Messages.AddAsync( - new Message - { - Id = GuidHelper.GenerateUuidV7(), - SubjectId = req.SubjectId, - CreatedBy = User.GetUserId(), - Value = req.Message - }, - ct); + var message = new Message + { + Id = GuidHelper.GenerateUuidV7(), + SubjectId = req.SubjectId, + CreatedBy = User.GetUserId(), + Value = req.Message + }; + + await context.Messages.AddAsync(message, ct); await context.SaveChangesAsync(ct); } diff --git a/src/Web/Messages/Handlers/PostReplyMessage.cs b/src/Web/Messages/Handlers/PostReplyMessage.cs index 6e7b995..277b3f1 100644 --- a/src/Web/Messages/Handlers/PostReplyMessage.cs +++ b/src/Web/Messages/Handlers/PostReplyMessage.cs @@ -4,18 +4,20 @@ using Hutopy.Web.Messages.Data; namespace Hutopy.Web.Messages.Handlers; -public record PostReplyMessageRequest( - Guid SubjectId, - Guid ParentId, - string Message); +internal sealed class PostReplyMessageRequest +{ + public required Guid SubjectId { get; set; } + public required Guid ParentId { get; set; } + public required string Message { get; set; } +} -public sealed class PostReplyMessage( +internal sealed class PostReplyMessage( MessagingDbContext context) : Endpoint { public override void Configure() { - Post("/api/messages/reply"); + Post("/api/messages/{ParentId:guid}/replies"); Options(o => o.WithTags("Messages")); } @@ -23,16 +25,16 @@ public sealed class PostReplyMessage( PostReplyMessageRequest req, CancellationToken ct) { - await context.Messages.AddAsync( - new Message - { - Id = GuidHelper.GenerateUuidV7(), - SubjectId = req.SubjectId, - ParentId = req.ParentId, - CreatedBy = User.GetUserId(), - Value = req.Message - }, - ct); + var message = new Message + { + Id = GuidHelper.GenerateUuidV7(), + SubjectId = req.SubjectId, + ParentId = req.ParentId, + CreatedBy = User.GetUserId(), + Value = req.Message + }; + + await context.Messages.AddAsync(message, ct); await context.SaveChangesAsync(ct); } diff --git a/src/Web/Messages/Migrations/20240718041130_Initial.Designer.cs b/src/Web/Messages/Migrations/20240718173016_Initial.Designer.cs similarity index 95% rename from src/Web/Messages/Migrations/20240718041130_Initial.Designer.cs rename to src/Web/Messages/Migrations/20240718173016_Initial.Designer.cs index c375b1b..e5d2cf2 100644 --- a/src/Web/Messages/Migrations/20240718041130_Initial.Designer.cs +++ b/src/Web/Messages/Migrations/20240718173016_Initial.Designer.cs @@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace Hutopy.Web.Messages.Migrations { [DbContext(typeof(MessagingDbContext))] - [Migration("20240718041130_Initial")] + [Migration("20240718173016_Initial")] partial class Initial { /// @@ -40,7 +40,7 @@ namespace Hutopy.Web.Messages.Migrations b.Property("CreatedBy") .HasColumnType("uuid"); - b.Property("ParentId") + b.Property("ParentId") .HasColumnType("uuid"); b.Property("SubjectId") diff --git a/src/Web/Messages/Migrations/20240718041130_Initial.cs b/src/Web/Messages/Migrations/20240718173016_Initial.cs similarity index 98% rename from src/Web/Messages/Migrations/20240718041130_Initial.cs rename to src/Web/Messages/Migrations/20240718173016_Initial.cs index fbb3817..6a194da 100644 --- a/src/Web/Messages/Migrations/20240718041130_Initial.cs +++ b/src/Web/Messages/Migrations/20240718173016_Initial.cs @@ -23,7 +23,7 @@ namespace Hutopy.Web.Messages.Migrations SubjectId = table.Column(type: "uuid", nullable: false), CreatedBy = table.Column(type: "uuid", nullable: false), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "CURRENT_TIMESTAMP"), - ParentId = table.Column(type: "uuid", nullable: false), + ParentId = table.Column(type: "uuid", nullable: true), Value = table.Column(type: "text", nullable: false) }, constraints: table => diff --git a/src/Web/Messages/Migrations/MessagingDbContextModelSnapshot.cs b/src/Web/Messages/Migrations/MessagingDbContextModelSnapshot.cs index 64c03fb..22fe571 100644 --- a/src/Web/Messages/Migrations/MessagingDbContextModelSnapshot.cs +++ b/src/Web/Messages/Migrations/MessagingDbContextModelSnapshot.cs @@ -37,7 +37,7 @@ namespace Hutopy.Web.Messages.Migrations b.Property("CreatedBy") .HasColumnType("uuid"); - b.Property("ParentId") + b.Property("ParentId") .HasColumnType("uuid"); b.Property("SubjectId") diff --git a/start-infrastructure.sh b/start-infrastructure.sh index d7a15c2..cf9b7cc 100644 --- a/start-infrastructure.sh +++ b/start-infrastructure.sh @@ -6,4 +6,12 @@ docker run \ -e 'MSSQL_SA_PASSWORD=P@ssword123!' \ -p 1433:1433 \ --name azuresqledge \ - -d mcr.microsoft.com/azure-sql-edge \ No newline at end of file + -d mcr.microsoft.com/azure-sql-edge + + docker run \ + --cap-add SYS_PTRACE \ + -e 'POSTGRES_USER=sa' \ + -e 'POSTGRES_PASSWORD=P@ssword123!' \ + -p 5432:5432 \ + --name postgres \ + -d postgres \ No newline at end of file