mirror of
https://github.com/bitwarden/server
synced 2025-12-28 06:03:29 +00:00
* Move existing Billing SQL files into dbo folder I noticed that every other team had a nested dbo folder under their team folder while Billing did not. This change replicates that. * Add SQL files for ClientOrganizationMigrationRecord table * Add SQL Server migration for ClientOrganizationMigrationRecord table * Add ClientOrganizationMigrationRecord entity and repository interface * Add ClientOrganizationMigrationRecord Dapper repository * Add ClientOrganizationMigrationRecord EF repository * Add EF migrations for ClientOrganizationMigrationRecord table * Implement migration process * Wire up new Admin tool to migrate providers * Run dotnet format * Updated coupon and credit application per product request * AC-3057-3058: Fix expiration date and enabled from webhook processing * Run dotnet format * AC-3059: Fix assigned seats during migration * Updated AllocatedSeats in the case plan already exists * Update migration scripts to reflect current date
52 lines
2.0 KiB
C#
52 lines
2.0 KiB
C#
using Bit.Billing.Constants;
|
|
using Bit.Core.Services;
|
|
using Event = Stripe.Event;
|
|
namespace Bit.Billing.Services.Implementations;
|
|
|
|
public class SubscriptionDeletedHandler : ISubscriptionDeletedHandler
|
|
{
|
|
private readonly IStripeEventService _stripeEventService;
|
|
private readonly IOrganizationService _organizationService;
|
|
private readonly IUserService _userService;
|
|
private readonly IStripeEventUtilityService _stripeEventUtilityService;
|
|
|
|
public SubscriptionDeletedHandler(
|
|
IStripeEventService stripeEventService,
|
|
IOrganizationService organizationService,
|
|
IUserService userService,
|
|
IStripeEventUtilityService stripeEventUtilityService)
|
|
{
|
|
_stripeEventService = stripeEventService;
|
|
_organizationService = organizationService;
|
|
_userService = userService;
|
|
_stripeEventUtilityService = stripeEventUtilityService;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Handles the <see cref="HandledStripeWebhook.SubscriptionDeleted"/> event type from Stripe.
|
|
/// </summary>
|
|
/// <param name="parsedEvent"></param>
|
|
public async Task HandleAsync(Event parsedEvent)
|
|
{
|
|
var subscription = await _stripeEventService.GetSubscription(parsedEvent, true);
|
|
var (organizationId, userId, providerId) = _stripeEventUtilityService.GetIdsFromMetadata(subscription.Metadata);
|
|
var subCanceled = subscription.Status == StripeSubscriptionStatus.Canceled;
|
|
|
|
const string providerMigrationCancellationComment = "Cancelled as part of provider migration to Consolidated Billing";
|
|
|
|
if (!subCanceled)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (organizationId.HasValue && subscription is not { CancellationDetails.Comment: providerMigrationCancellationComment })
|
|
{
|
|
await _organizationService.DisableAsync(organizationId.Value, subscription.CurrentPeriodEnd);
|
|
}
|
|
else if (userId.HasValue)
|
|
{
|
|
await _userService.DisablePremiumAsync(userId.Value, subscription.CurrentPeriodEnd);
|
|
}
|
|
}
|
|
}
|