60 lines
1.8 KiB
C#
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);
|
|
}
|
|
}
|