Files
social-media/backend/Modules/Messaging/Handlers/GetMessagesByUser.cs

60 lines
1.8 KiB
C#

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<MessageDto> Messages);
public class GetMessagesByUser(
IUserLookup userLookup,
MessagingDbContext context)
: Endpoint<GetMessagesByUserRequest, GetMessagesByUserResponse>
{
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<Message> 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);
}
}