using Hutopy.Modules.Identity.Contracts; using Hutopy.Modules.Messaging.Data; using Hutopy.Modules.Messaging.Models; namespace Hutopy.Modules.Messaging.Handlers; [PublicAPI] public class GetMessagesByUserRequest { public Guid UserId { get; set; } } [PublicAPI] public record struct GetMessagesByUserResponse( IEnumerable Messages); public class GetMessagesByUser( IUserLookup userLookup, MessagingDbContext context) : Endpoint { public override void Configure() { Get("/api/messages/user/{UserId:guid}"); Options(o => o.WithTags("Messages")); AllowAnonymous(); } public override async Task HandleAsync( GetMessagesByUserRequest req, CancellationToken ct) { List messages = await context .Messages .Where(c => c.CreatedBy == req.UserId) .Where(c => c.ParentId == null) .ToListAsync(ct); MessageDto[] result = await Task.WhenAll( messages.Select(async message => { UserReference? user = await userLookup.GetUserAsync(message.CreatedBy, ct); return new MessageDto { Id = message.Id, ParentId = message.ParentId, CreatedAt = message.CreatedAt, CreatedBy = message.CreatedBy, CreatedByName = user?.Fullname ?? "Unknown User", CreatedByPortraitUrl = user?.PortraitUrl ?? "", SubjectId = message.SubjectId, Value = message.Value }; })); await SendOkAsync(new GetMessagesByUserResponse(result), ct); } }