mirror of
https://github.com/bitwarden/server.git
synced 2025-06-25 13:18:48 -05:00

* Changes ensures provider_id is handled and stored for Braintree. Signed-off-by: Cy Okeke <cokeke@bitwarden.com> * refactoring of the stripeController class Signed-off-by: Cy Okeke <cokeke@bitwarden.com> * Move the constant variables to utility class Signed-off-by: Cy Okeke <cokeke@bitwarden.com> * Adding comments to the methods Signed-off-by: Cy Okeke <cokeke@bitwarden.com> * Add more comments to describe the method Signed-off-by: Cy Okeke <cokeke@bitwarden.com> * Add the providerId changes Signed-off-by: Cy Okeke <cokeke@bitwarden.com> * Add the missing providerId Signed-off-by: Cy Okeke <cokeke@bitwarden.com> * Fix the IsSponsoredSubscription bug Signed-off-by: Cy Okeke <cokeke@bitwarden.com> --------- Signed-off-by: Cy Okeke <cokeke@bitwarden.com>
97 lines
3.1 KiB
C#
97 lines
3.1 KiB
C#
using Bit.Billing.Constants;
|
|
using Stripe;
|
|
using Event = Stripe.Event;
|
|
|
|
namespace Bit.Billing.Services.Implementations;
|
|
|
|
public class PaymentMethodAttachedHandler : IPaymentMethodAttachedHandler
|
|
{
|
|
private readonly ILogger<PaymentMethodAttachedHandler> _logger;
|
|
private readonly IStripeEventService _stripeEventService;
|
|
private readonly IStripeFacade _stripeFacade;
|
|
private readonly IStripeEventUtilityService _stripeEventUtilityService;
|
|
|
|
public PaymentMethodAttachedHandler(
|
|
ILogger<PaymentMethodAttachedHandler> logger,
|
|
IStripeEventService stripeEventService,
|
|
IStripeFacade stripeFacade,
|
|
IStripeEventUtilityService stripeEventUtilityService)
|
|
{
|
|
_logger = logger;
|
|
_stripeEventService = stripeEventService;
|
|
_stripeFacade = stripeFacade;
|
|
_stripeEventUtilityService = stripeEventUtilityService;
|
|
}
|
|
|
|
public async Task HandleAsync(Event parsedEvent)
|
|
{
|
|
var paymentMethod = await _stripeEventService.GetPaymentMethod(parsedEvent);
|
|
if (paymentMethod is null)
|
|
{
|
|
_logger.LogWarning("Attempted to handle the event payment_method.attached but paymentMethod was null");
|
|
return;
|
|
}
|
|
|
|
var subscriptionListOptions = new SubscriptionListOptions
|
|
{
|
|
Customer = paymentMethod.CustomerId,
|
|
Status = StripeSubscriptionStatus.Unpaid,
|
|
Expand = ["data.latest_invoice"]
|
|
};
|
|
|
|
StripeList<Subscription> unpaidSubscriptions;
|
|
try
|
|
{
|
|
unpaidSubscriptions = await _stripeFacade.ListSubscriptions(subscriptionListOptions);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
_logger.LogError(e,
|
|
"Attempted to get unpaid invoices for customer {CustomerId} but encountered an error while calling Stripe",
|
|
paymentMethod.CustomerId);
|
|
|
|
return;
|
|
}
|
|
|
|
foreach (var unpaidSubscription in unpaidSubscriptions)
|
|
{
|
|
await AttemptToPayOpenSubscriptionAsync(unpaidSubscription);
|
|
}
|
|
}
|
|
|
|
private async Task AttemptToPayOpenSubscriptionAsync(Subscription unpaidSubscription)
|
|
{
|
|
var latestInvoice = unpaidSubscription.LatestInvoice;
|
|
|
|
if (unpaidSubscription.LatestInvoice is null)
|
|
{
|
|
_logger.LogWarning(
|
|
"Attempted to pay unpaid subscription {SubscriptionId} but latest invoice didn't exist",
|
|
unpaidSubscription.Id);
|
|
|
|
return;
|
|
}
|
|
|
|
if (latestInvoice.Status != StripeInvoiceStatus.Open)
|
|
{
|
|
_logger.LogWarning(
|
|
"Attempted to pay unpaid subscription {SubscriptionId} but latest invoice wasn't \"open\"",
|
|
unpaidSubscription.Id);
|
|
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
await _stripeEventUtilityService.AttemptToPayInvoiceAsync(latestInvoice, true);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
_logger.LogError(e,
|
|
"Attempted to pay open invoice {InvoiceId} on unpaid subscription {SubscriptionId} but encountered an error",
|
|
latestInvoice.Id, unpaidSubscription.Id);
|
|
throw;
|
|
}
|
|
}
|
|
}
|