using Hutopy.Infrastructure.Security; using Hutopy.Modules.Messaging.Data; namespace Hutopy.Modules.Messaging.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) { Message? message = await context.Messages.FirstOrDefaultAsync(x => x.Id == req.MessageId, ct); if (message is null) { await SendNotFoundAsync(ct); return; } Guid userId = HttpContext.User.GetUserId(); if (message.CreatedBy != userId) { await SendForbiddenAsync(ct); return; } context.Messages.Remove(message); await context.SaveChangesAsync(ct); } }