55 lines
1.7 KiB
C#
55 lines
1.7 KiB
C#
using Hutopy.Infrastructure.Security;
|
|
using Hutopy.Modules.Creators.Contracts;
|
|
using Hutopy.Modules.Memberships.Data;
|
|
|
|
namespace Hutopy.Modules.Memberships.Handlers;
|
|
|
|
[PublicAPI]
|
|
public record struct GetActiveMembershipsResponse(
|
|
Guid Id,
|
|
Guid CreatorId,
|
|
string CreatorName,
|
|
string CreatorPortraitUrl,
|
|
DateTimeOffset? StartDate,
|
|
DateTimeOffset? EndDate);
|
|
|
|
[PublicAPI]
|
|
public class GetActiveMembershipsHandler(
|
|
ICreatorLookup creatorLookup,
|
|
MembershipsDbContext dbContext)
|
|
: EndpointWithoutRequest<IEnumerable<GetActiveMembershipsResponse>>
|
|
{
|
|
public override void Configure()
|
|
{
|
|
Get("/api/memberships/active");
|
|
Options(o => o.WithTags("Memberships"));
|
|
}
|
|
|
|
public override async Task HandleAsync(
|
|
CancellationToken ct)
|
|
{
|
|
List<Membership> subscriptions = await dbContext
|
|
.Memberships
|
|
.Where(subscription => subscription.UserId == User.GetUserId())
|
|
.Where(subscription => subscription.State == MembershipState.Active)
|
|
.ToListAsync(ct);
|
|
|
|
GetActiveMembershipsResponse[] result = await Task.WhenAll(
|
|
subscriptions.Select(async subscription =>
|
|
{
|
|
CreatorReference? creator = await creatorLookup.GetCreatorAsync(subscription.CreatorId, ct);
|
|
|
|
return new GetActiveMembershipsResponse(
|
|
subscription.Id,
|
|
subscription.CreatorId,
|
|
creator?.Name ?? "Unknown Creator",
|
|
creator?.PortraitUrl ?? string.Empty,
|
|
subscription.StartDate,
|
|
subscription.EndDate);
|
|
}));
|
|
|
|
|
|
await SendOkAsync(result, ct);
|
|
}
|
|
}
|