From 7e820e166f72277987f0b08ffde12e6c1f02e841 Mon Sep 17 00:00:00 2001 From: Dominic Villemure Date: Thu, 29 Aug 2024 00:24:56 -0400 Subject: [PATCH] Change and Delete messages --- .../Contents/Handlers/GetContentsByCreator.cs | 40 ------------ .../Messages/Handlers/ChangeMessage.cs | 64 +++++++++++++++++++ .../Messages/Handlers/DeleteMessage.cs | 52 +++++++++++++++ 3 files changed, 116 insertions(+), 40 deletions(-) create mode 100644 src/Web/Features/Messages/Handlers/ChangeMessage.cs create mode 100644 src/Web/Features/Messages/Handlers/DeleteMessage.cs diff --git a/src/Web/Features/Contents/Handlers/GetContentsByCreator.cs b/src/Web/Features/Contents/Handlers/GetContentsByCreator.cs index 571815d..33ce7ae 100644 --- a/src/Web/Features/Contents/Handlers/GetContentsByCreator.cs +++ b/src/Web/Features/Contents/Handlers/GetContentsByCreator.cs @@ -28,46 +28,6 @@ public class GetContentsByCreatorHandler( GetContentsByCreatorRequest req, CancellationToken ct) { -// var queryBuilder = new StringBuilder(); -// queryBuilder.AppendLine($""" -// SELECT content."Id", -// content."CreatedBy", -// creator."Name" as CreatedByName, -// i."Logo" as CreatedByPortraitUrl, -// c."Menu" as ColorMenu, -// c."Accent" as ColorAccent, -// content."CreatedAt", -// content."DeletedBy", -// content."DeletedAt", -// content."Title", -// content."Description", -// content."Urls", -// FROM "Content"."Contents" AS content -// INNER JOIN "Content"."Creators" AS creator ON content."CreatedBy" = creator."Id" -// LEFT JOIN "Content"."Images" AS i ON creator."Id" = i."CreatorId" -// LEFT JOIN "Content"."Colors" AS c ON creator."Id" = c."CreatorId" -// WHERE content."CreatedBy" = '{req.CreatorId}' -// AND content."DeletedBy" IS NULL -// """); -// -// if (req.LastId.HasValue) -// { -// queryBuilder.AppendLine($"""AND content."Id" > '{req.LastId.Value}'"""); -// } -// -// queryBuilder.AppendLine($""" -// ORDER BY content."CreatedAt" DESC -// LIMIT {req.PageSize} -// """); -// -// var query = queryBuilder.ToString(); -// -// var results = await context -// .Database -// .SqlQueryRaw(query) -// .ToListAsync(cancellationToken: ct); - - var query = context.Contents .Where(c => c.CreatedBy == req.CreatorId && c.DeletedAt == null) .OrderByDescending(c => c.CreatedAt); diff --git a/src/Web/Features/Messages/Handlers/ChangeMessage.cs b/src/Web/Features/Messages/Handlers/ChangeMessage.cs new file mode 100644 index 0000000..0889af9 --- /dev/null +++ b/src/Web/Features/Messages/Handlers/ChangeMessage.cs @@ -0,0 +1,64 @@ +using Hutopy.Web.Common; +using Hutopy.Web.Features.Messages.Data; + +namespace Hutopy.Web.Features.Messages.Handlers; + +public sealed class ChangeMessageRequest +{ + public Guid? Id { get; set; } + public required Guid SubjectId { get; set; } + public required string Message { get; set; } +} + +internal sealed class ChangeMessageRequestValidator + : Validator +{ + public ChangeMessageRequestValidator() + { + RuleFor(r => r.SubjectId) + .NotNull().WithMessage("You must specify a SubjectId") + .NotEmpty().WithMessage("You must specify a non-empty SubjectId"); + + RuleFor(r => r.Message) + .NotNull().WithMessage("You must specify a Message") + .NotEmpty().WithMessage("You must specify a non-empty Message"); + } +} + +public class ChangeMessage( + MessagingDbContext context) + : Endpoint +{ + public override void Configure() + { + Post("/api/messages/update"); + Options(o => o.WithTags("Messages")); + } + + public override async Task HandleAsync( + ChangeMessageRequest req, + CancellationToken ct) + { + var message = await context.Messages.FirstOrDefaultAsync(x => x.Id == req.Id, ct); + + if (message is null) + { + await SendNotFoundAsync(ct); + return; + } + + var userId = HttpContext.User.GetUserId(); + if (message.CreatedBy != userId) + { + await SendForbiddenAsync(ct); + return; + } + + message.SubjectId = req.SubjectId; + message.Value = req.Message; + + context.Update(message); + + await context.SaveChangesAsync(ct); + } +} diff --git a/src/Web/Features/Messages/Handlers/DeleteMessage.cs b/src/Web/Features/Messages/Handlers/DeleteMessage.cs new file mode 100644 index 0000000..dc5a9f0 --- /dev/null +++ b/src/Web/Features/Messages/Handlers/DeleteMessage.cs @@ -0,0 +1,52 @@ +using Hutopy.Web.Common; +using Hutopy.Web.Features.Messages.Data; + +namespace Hutopy.Web.Features.Messages.Handlers; + +public record DeleteMessageRequest(Guid MessageId); + +internal sealed class DeleteMessageRequestValidator + : Validator +{ + public DeleteMessageRequestValidator() + { + RuleFor(r => r.MessageId) + .NotNull().WithMessage("You must specify a MessageId") + .NotEmpty().WithMessage("You must specify a non-empty MessageId"); + } +} + +public class DeleteMessage( + MessagingDbContext context) + : Endpoint +{ + public override void Configure() + { + Delete("/api/messages/{MessageId}"); + Options(o => o.WithTags("Messages")); + } + + public override async Task HandleAsync( + DeleteMessageRequest req, + CancellationToken ct) + { + var message = await context.Messages.FirstOrDefaultAsync(x => x.Id == req.MessageId, ct); + + if (message is null) + { + await SendNotFoundAsync(ct); + return; + } + + var userId = HttpContext.User.GetUserId(); + if (message.CreatedBy != userId) + { + await SendForbiddenAsync(ct); + return; + } + + context.Messages.Remove(message); + + await context.SaveChangesAsync(ct); + } +}