50 lines
1.3 KiB
C#
50 lines
1.3 KiB
C#
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<CancelMembershipRequest>
|
|
{
|
|
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);
|
|
}
|
|
}
|