using Hutopy.Modules.Memberships.Contracts; using Hutopy.Modules.Memberships.Data; namespace Hutopy.Modules.Memberships.Handlers; [PublicAPI] public class CancelMembershipRequest { public Guid SubscriptionId { get; set; } } public class CancelMembershipHandler( MembershipsDbContext dbContext, IMembershipCancellationProcessor cancellationProcessor) : Endpoint { public override void Configure() { Delete("/api/memberships"); Options(o => o.WithTags("Memberships")); } public override async Task HandleAsync( CancelMembershipRequest req, CancellationToken ct) { Membership? subscription = await dbContext .Memberships .FindAsync( [req.SubscriptionId], ct); if (subscription is not { EndDate: null } || subscription.StripeSubscriptionId is null) { await SendNotFoundAsync(ct); return; } // Cancel Stripe subscription await cancellationProcessor.CancelAsync(subscription.StripeSubscriptionId, ct); // Update subscription in the system subscription.EndDate = DateTime.UtcNow; await dbContext.SaveChangesAsync(ct); await SendOkAsync(subscription.Id, ct); } }